2010-06-16 3 views
1

J'utilise Qt 4.5, donc C++. J'ai une classe comme çaDéclaration des variables struct dans l'autre classe quand elles sont obtenues par getters

class CClass1 
    { 
     private: 
       struct stModelDetails 
       { 
         QString name; 
         QString code; 
         ..... // only variables and no functions over here 
       }; 
       QList<stModelDetails> m_ModelDetailsList;   

     public: 
       QList<stModelDetails> getModelDetailsList(); 
       ...    
    }; 

Dans ce que j'ai des fonctions qui peupleront la m_ModelDetailsList;

J'ai une autre classe disent CClassStructureUsage, où je vais appeler la fonction getModelDetailsList(). Maintenant, mon besoin est que je dois traverser le QList et obtenir le name, code de chacun des stModelDetails.

Maintenant le problème est même Le fichier d'en-tête CClass1 est inclus il n'est pas capable d'identifier le type de stModelDetails dans CClassStructureUsage. Quand je reçois la liste de la structure par

QList<stModelDetails> ModelList = obj->getModelInformationList(); 

il dit stModelDetails: identificateur non déclaré.

Comment puis-je récupérer les valeurs de la structure? Est-ce que je fais quelque chose de mal ici?

Répondre

2

Vous avez déjà reçu quelques suggestions pour attaquer directement votre problème. Cependant, je recommanderais de prendre du recul pour examiner ce que vous essayez d'accomplir ici. Tout d'abord, vous avez dit que vous seulement vraiment voulez le membre name de chaque article stModelDetails. Sur cette base, je commencerais en changeant la fonction de revenir seulement:

QList<QString> GetModelDetailNames(); 

ou, très probablement:

QVector<QString> GetModelDetailNames(); 

Le premier a quelques bons points. Premièrement, cela réduit la quantité de données à copier. Deuxièmement, il empêche le code client de connaître plus de détails d'implémentation de CClass1. Ce dernier conserve ces avantages, et en ajoute quelques-uns, en évitant principalement les frais généraux d'une liste liée dans une situation où vous n'avez pas indiqué une raison pour laquelle vous souhaitez utiliser une liste chaînée (et de telles raisons sont vraiment assez inhabituel).L'alternative à cela est de comprendre pourquoi le code externe a besoin d'accéder à une grande partie des données internes de CClass1, et si cela n'a pas de sens que CClass1 fournisse ce service directement au lieu du code externe ayant besoin d'accéder à ses données.

+0

Non, je dois obtenir toutes les valeurs de la structure. Je viens de donner un exemple dans le code. Mais votre deuxième point est valable. Je vais y penser. Mais est-ce une bonne pratique de n'avoir que la déclaration de structure dans un fichier d'en-tête et de l'inclure là où c'est nécessaire? Prenez ma question comme un exemple pour le scénario. – liaK

+1

@liaK: eh bien, si vous avez besoin de toute la structure, c'est certainement une bonne idée de définir cette structure, oui. –

+0

Je vais marquer la vôtre comme la réponse à l'approche que vous avez indiquée en fonction de l'accès aux données. – liaK

4

Depuis struct stModelDetails est private, il n'est pas visible de l'extérieur de la classe. Vous devez déclarer dans la section public de votre classe à la place:

class CClass1 
{ 
    private: 
      QList<stModelDetails> m_ModelDetailsList;   

    public: 
      struct stModelDetails 
      { 
        QString name; 
        QString code; 
        ..... // only variables and no functions over here 
      }; 

      QList<stModelDetails> getModelDetailsList(); 
      ...    
}; 
+1

@liaK en fonction de ce que vous voulez exposer à partir de stModelDetails vous pouvez aussi en faire une classe et protéger les données privées avec des accesseurs –

0

Le problème est que vous avez déclaré stModelDetails en tant que classe privée. Le mettre dans la section publique devrait résoudre votre problème.

4

Vous devez utiliser le nom complet CClass1::stModelDetails. Maintenant, il vous dira qu'il est privé :)

0

Il y a deux problèmes: 1. Vous avez déjà mentionné que vous devez déplacer stModelDetails dans la section publique de votre classe. 2. Étant donné qu'il est imbriqué, le nom propre de celui-ci en dehors de la classe est CClass1 :: stModelDetails.

Si vous avez vraiment besoin d'y accéder de l'extérieur, vous pouvez vous demander s'il devrait être membre de CClass1 ou s'il devrait être une classe autonome ou struct. En général, j'utilise uniquement des classes/structures imbriquées lorsqu'elles sont un détail d'implémentation de ma classe.

Questions connexes