-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

我已经很好地包含了头文件,这是生成错误的代码部分的“简化版本”的一部分。而且我一直在搜索互联网并阅读了一些我可能需要编写一个包装函数来为我事先实例化指针的地方,但我并没有真正理解这个概念。任何评论或帮助将不胜感激。

4

1 回答 1

0

如果要按值传递结构(即,不作为引用、const 引用或指向它的指针),则使用该结构的代码必须知道该结构的内容——当然,在使用成员变量时对于结构体,必须知道结构体的确切内容。换句话说,clsC的代码必须包含 的定义,struct myStruct以允许编译器生成获取 的代码value

在您的情况下,这很可能意味着struct myStruct需要在不同的头文件中声明。

您还有一些完全不相关的其他错误,我很确定它们甚至不在您发布的代码中,这使得解码它们有点困难。

于 2013-05-02T11:50:29.980 回答