2013-05-02 1 views
-1

Я пытаюсь написать библиотеку в Qt и содержит три класса C++. clsA, который должен быть единственным экземпляром для приложения (поэтому у меня есть функция Instance). clsA номер экземпляра clsB зависит от разных состояний, которые должны содержать указатели, чтобы взаимодействовать с ними позже. clsC - это интерфейс, который впоследствии должен реализовать разработчик и получить экземпляр, а указатели на них должны быть переданы в функцию clsA::init. Так что, если разработчик хочет использовать библиотеку, он/она должен написать что-то вроде этого:Как иметь структуры и указатели класса как типа, чтобы вы могли передать их функциям?

QList<clsC*> l; 
clsC1* one = new clsC1(); 
l.append(one); 
clsC2* two = new clsC2(); 
l.append(two); 
//and so on 

clsA* a = clsA::Instance(); 
a->init(l); 

и класс clsA выглядит следующим образом:

#include "clsB.h" 
#include "clsC.h" 
namespace MRZ{ 
namespace Core{ 

class clsA :public QObject 
{ 
    Q_OBJECT 

public: 
     static clsA* Instance() 
        { if(instance == NULL) return new clsAlertManager(); } 

     //stores the pointers in a Qmap 
     void init(QList<clsC*> _listOfPointers); //line number 37 

protected: 
     static inline clsC* getclsCPointer(QString _key) //line number 42 
        { return clsCPointers.value(_key);} 

private: 
     static clsAlertManager* instance; 
     clsAlertManager(){instance = this;} 

    // depend on some variables this method instantiates clsB and store 
    // the pointers in another QMAP called clsBPointers with some int ID 
     void initclsB(); 

     QMap<int, clsB*> clsBPointers; 
     QMap<QString, clsC*> clsCPointers; 
}; 
} 
} 

И ничего особенного класса clsB заголовка, кроме меня есть Заявленный структура в нем нравится:

namespace MRZ{ 
namespace Core{ 

struct myStruct { int Value; }; 

class clsB: public QObject 
{ 
    Q_OBJECT 
    //calss definition 

}; 

} 
} 
Q_DECLARE_METATYPE(MRZ::Core::myStruct) 

, а также в одном из clsB функции:

bool clsB::someFun(Qstring _key) 
{ 
    clsC* c = clsA::getclsCPointer(_key); 
    return c->someOtherFun(myInstantiatedStruct); 
} 

И clsC, который является интерфейсом, который должен быть разработан позже в приложении выглядит следующим образом:

namespace MRZ{ 
namespace Core{ 

class clsC 
{ 

public: 
    clsC(); 

    bool someOtherFun(struct myStruct _struct);//line number 39 
    { return this->isTure(_struct.Value);} 


protected: 
    virtual bool isTrue(int _value) = 0; 
    //some virtual function that should be developed later 
}; 

} 
} 

Но когда я пытаюсь построить проект, я получаю много ошибок с указанием:

clsC.h:39: error: '_struct' has incomplete type 
clsC.h:39: error: forward declaration of 'MRZ::Core::myStruct' 

clsA.h:37: error: 'clsC' was not declared in this scope 
clsA.h:37: error: template argument 1 is invalid 

clsA.h:42: error: 'clsC' does not name a type 

Я включил файлы заголовков просто отлично, и это часть «упрощенной версии» части кода, которая генерирует ошибки. И я искал в Интернете и читал некоторые, где мне, возможно, понадобится написать функцию-обертку, чтобы подталкивать указатели перед рукой для меня, но я действительно не понял эту концепцию. Любые комментарии или помощь будут оценены.

+1

Включили ли вы заголовок 'clsB' в' clsC'? – cmannett85

+0

Да, похоже, что clsB не включен в clsC. Может быть, clsC также включен в какой-то другой заголовок вашего кода? Я бы предложил поместить '' #include "clsB.h" в clsC.h и использовать '# ifndef', чтобы убедиться, что он загружен только один раз – psibar

+0

да, я их включаю с' # ifndef', но все же я получаю ошибки – mrz

ответ

0

Если вы хотите передать структуру по значению (то есть не как ссылку, ссылку на константу или указатель на нее), то содержимое структуры должно быть известно коду с использованием структуры - и, конечно, при использовании переменных-членов структуры должно быть известно точное содержимое структуры. Другими словами, код clsC должен содержать определение struct myStruct, чтобы позволить компилятору сгенерировать код, который извлекает value.

В вашем случае это может означать, что struct myStruct необходимо объявить в другом заголовочном файле.

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

Смежные вопросы