Массивы и классы?

Я новичок в 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;
}

-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. Сделать возврат геттеров по константной ссылке
  6. Создание методов, которые не могут изменить состояние объекта const
  7. Сделать элементы, которые не меняются за время существования объекта const

РЕДАКТИРОВАТЬ:

Думайте о своем определении класса как о чертеже, а о члене — как о реальном объекте. Если бы мы хотели 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);
1

Другие решения

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

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

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

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

По вопросам рекламы [email protected]