2016-07-01 6 views
-1

Я новичок в C++ и работаю над проектом, где у меня есть массив экземпляров класса, и внутри этого класса у меня есть структура, внутри которой есть функция. Как использовать эту функцию в моем основном кодовом блоке. Я попыталсяМассивы и классы?

class artwork { 
    struct art { 
     // the struct art contains important information such as artist, title and medium. 
    private: 
     string artist; 
    public: 
     void setArtist(string values); 
     string getArtist(); 
    }; 

    void artwork::art::setArtist(string values) { 
     artist = values; 
    } 

int main(){ 
    artwork myartwork[500]; 
    for (int i = 0; i < 500; i++) { 

     ///----------------------------------- 
     ///----------------------------------- 
     // below is where the error occurs? How do I reference setArtist? 
     ///----------------------------------- 
     ///----------------------------------- 

     cout << myartwork[0].art.setArtist("Tim"); 
    } 
    system("pause"); 
    return 0; 
} 
+2

Начните с размещения действующего кода. Это облегчит понимание. – juanchopanza

ответ

1

Несколько вещей нужно изменить здесь:

  1. class artwork нуждается в переменную-член типа art
  2. Эта переменная-член должна быть обнародована
  3. Переменный элемент должен иметь имя, отличное от art, потому что что уже называет тип структуры
  4. Вам необходимо закрывающую фигурную скобку и точку с запятой для artwork

Ваш код должен, вероятно, решить что-то вроде этого:

class artwork { 
public: 
    struct art { 
    private: 
     string artist; 
    public: 
     void setArtist(string values){artist = values;} 
     string getArtist(){return artist;} 
    } art_; 
}; 

int main(){ 
    artwork myartwork[500]; 
    for(int i = 0; i < 500; i++) { 
     myartwork[i].art_.setArtist("Tim"); 
     cout << myartwork[i].art_.getArtist(); 

    } 
} 

Другие полезные советы:

  1. объектов Передавать по ссылке
  2. ИНИЦИАЛИЗИРУЙТЕ в конструкторах, а не с методами инициализации
  3. Предпочитаю делать инициализация присваивания конструктору для типов агрегирования данных
  4. Петля по размеру массива не магических чисел
  5. Make добытчики вернуться к константной ссылке
  6. Сделать методы, которые не могут изменить состояние объекта сопзЬ
  7. Сделать пользователь, которые не изменяются в течение времени жизни объекта сопзЬ

EDIT :

Подумайте о своем определении класса в качестве чертежа и члена как фактического объекта.Если мы хотели artwork, что было несколько art объектов, в случае сотрудничества, возможно, тогда мы могли бы сделать это:

class artwork { 
public: 
    struct art { 
    private: 
     string artist; 
    public: 
     void setArtist(string values){artist = values;} 
     string getArtist(){return artist;} 
    }; 

    art art1_; 
    art art2_; 
}; 

Обратите внимание, что мы не определить struct дважды, мы просто определить 2 объекта. Тогда, если бы у нас был объект искусства, например: artwork foo, мы могли бы сделать:

foo.art1_("Sam Arnold"s); 
foo.art2_("Jonathan Mee"s); 
+0

Я сделал член, и он отлично работал. Спасибо. Я новичок в C++. и просто взял сегодня книгу, чтобы практиковать. Я не уверен, почему мне нужно было сделать это членом класса? –

+0

Я сделал редактирование, чтобы помочь прояснить разницу между определением класса и объектом. Вероятно, нам следует открыть новый вопрос, если у вас возникнут другие проблемы, но попробуйте просмотреть список полезных советов, в котором есть много ключевых концепций. –

-1

Трудно сказать, основываясь на том, что содержится в вопросе, но вы должны знать, что C++ делает все члены класса «частный», если не указано иное. В этом случае:

cout << myartwork[0].art.setArtist("Tim"); 

потерпит неудачу по двум причинам:

  1. setArtist не является общедоступным (так как объект искусства является частным, это не имеет значения, что SetArtist является открытым, вы не можете добраться до него из-за пределов)
  2. соиЬ, скорее всего, ожидает что-то выход, так setArtist (возвращение недействительными), скорее всего, присутствует проблема