Я пытаюсь написать библиотеку в 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
Я включил файлы заголовков просто отлично, и это часть «упрощенной версии» части кода, которая генерирует ошибки. И я искал в Интернете и читал некоторые, где мне, возможно, понадобится написать функцию-обертку, чтобы подталкивать указатели перед рукой для меня, но я действительно не понял эту концепцию. Любые комментарии или помощь будут оценены.
Включили ли вы заголовок 'clsB' в' clsC'? – cmannett85
Да, похоже, что clsB не включен в clsC. Может быть, clsC также включен в какой-то другой заголовок вашего кода? Я бы предложил поместить '' #include "clsB.h" в clsC.h и использовать '# ifndef', чтобы убедиться, что он загружен только один раз – psibar
да, я их включаю с' # ifndef', но все же я получаю ошибки – mrz