2016-07-01 3 views
-1

Je suis novice en C++ et je travaille sur un projet où j'ai un tableau d'instances d'une classe, et au sein de cette classe j'ai une structure dans laquelle j'ai une fonction. Comment utiliser cette fonction dans mon bloc de code principal. J'ai essayéTableaux et classes?

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

Vous devriez commencer par poster un code valide. Cela le rendra plus facile à comprendre. – juanchopanza

Répondre

1

Plusieurs choses doivent changer ici:

  1. class artwork a besoin d'une variable membre de type art
  2. Cette variable membre doit être rendu public
  3. La variable membre doit avoir un nom différent de celui du art, parce que qui nomme déjà le type de struct
  4. Vous avez besoin d'une accolade fermante et virgule pour artwork

Votre code devrait résoudre probablement quelque chose comme ceci:

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(); 

    } 
} 

Autres conseils utiles:

  1. objets passage par référence
  2. Initialiser dans les constructeurs plutôt que des méthodes d'initialisation
  3. préfère faire affectation de l'affectation à un constructeur pour les types d'agrégation de données
  4. Boucle en fonction de la taille du groupe et non nombres magiques
  5. getters faire revenir par référence const
  6. Faire des méthodes qui ne peuvent pas changer l'état de l'objet const
  7. Faire des membres qui ne changent pas pour la durée de vie de l'objet const

EDIT :

Considérez votre définition de classe comme le plan et le membre comme l'objet réel.Si nous voulions un artwork qui avait plusieurs objets art, dans le cas d'une collaboration peut-être, nous pourrions le faire:

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

    art art1_; 
    art art2_; 
}; 

Notez que nous ne définissons pas la struct deux fois, nous définissons seulement 2 objets. Ensuite, si nous avions un objet d'illustration comme: artwork foo nous pourrions faire:

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

J'ai fait le membre et cela a fonctionné parfaitement. Je vous remercie. Je suis nouveau en C++. et vient de prendre un livre aujourd'hui pour pratiquer. Je ne suis pas sûr pourquoi je devais faire un membre contre une classe si? –

+0

J'ai effectué une modification pour tenter de clarifier la différence entre une définition de classe et un objet. Nous devrions probablement ouvrir une nouvelle question si vous avez d'autres problèmes de suivi, mais essayez de parcourir cette liste de «conseils utiles», car il y a beaucoup de concepts clés. –

-1

Difficile à dire en fonction de ce qui est prévu dans la question, mais vous devez être conscient que C++ fait tous les membres de la classe « privée », sauf indication contraire. Dans ce cas:

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

serait échouer pour deux raisons:

  1. setArtist ne sont pas accessibles au public (parce que l'objet d'art est privé, il n'a pas d'importance que SetArtist est public, vous ne pouvez pas y accéder depuis l'extérieur)
  2. est le plus cout attend probablement quelque chose à la sortie, de sorte setArtist (retour vide) serait probablement présente un problème