Объявление переменных структуры в другом классе при получении геттерами - PullRequest
1 голос
/ 16 июня 2010

Я использую Qt 4.5, так же как и C ++.У меня есть такой класс

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

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

В этом у меня есть функции, которые будут заполнять m_ModelDetailsList;

У меня есть другой класс, скажем CClassStructureUsage, где я буду вызывать getModelDetailsList()функция.Теперь мне нужно, чтобы мне пришлось пройти через QList и получить name, code от каждого из stModelDetails.

Теперь проблема в том, что даже заголовочный файл CClass1 включен он не может определить тип stModelDetails в CClassStructureUsage.Когда я получаю список структур по

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

, он говорит: stModelDetails: необъявленный идентификатор .

Как я могу получить значения из структуры?Я что-то здесь не так делаю?

Ответы [ 5 ]

4 голосов
/ 16 июня 2010

Вам необходимо использовать полное имя CClass1::stModelDetails. Теперь он скажет вам, что это личное:)

4 голосов
/ 16 июня 2010

Поскольку struct stModelDetails равно private, он не виден снаружи класса. Вы должны объявить это в разделе public вашего класса:

class CClass1
{
     private:
           QList<stModelDetails> m_ModelDetailsList;        

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

           QList<stModelDetails> getModelDetailsList();
           ...               
};
2 голосов
/ 16 июня 2010

Вы уже получили несколько предложений о том, как атаковать вашу проблему напрямую. Тем не менее, я бы порекомендовал на секунду отступить, чтобы подумать, чего вы здесь добиваетесь. Прежде всего, вы сказали, что только действительно хотите name член каждого элемента stModelDetails. Исходя из этого, я бы начал с изменения функции, чтобы она возвращала только следующее:

QList<QString> GetModelDetailNames();

или, вполне возможно:

QVector<QString> GetModelDetailNames();

У первого есть пара хороших моментов. Во-первых, это уменьшает объем данных, которые необходимо скопировать. Во-вторых, он не позволяет клиентскому коду знать больше деталей реализации CClass1. Последний сохраняет эти преимущества и добавляет несколько своих, в первую очередь избегая накладных расходов связанного списка в ситуации, когда вы не указали ни одной причины, по которой вы хотите использовать связанный список ( и такие причины действительно довольно необычны).

Альтернатива этому состоит в том, чтобы выяснить, почему внешнему коду необходим доступ к такой большой части внутренних данных CClass1, и не имеет ли смысла для CClass1 предоставлять эту услугу напрямую, а не к внешнему коду, необходимому для доступа к его данным. 1015 *

0 голосов
/ 16 июня 2010

Есть две проблемы: 1. Уже упоминалось, что вам нужно переместить stModelDetails в публичный раздел вашего класса.2. Поскольку он является вложенным, его правильное имя вне класса - CClass1 :: stModelDetails.

Если вам действительно нужен доступ к нему извне, вы можете решить, должен ли он быть членомCClass1 или если это должен быть отдельный класс или структура.Обычно я использую вложенные классы / структуры только тогда, когда они являются подробностями реализации моего класса.

0 голосов
/ 16 июня 2010

Проблема в том, что вы объявили stModelDetails как закрытый класс.Размещение в публичном разделе должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...