对于一个项目,我必须编写一个容器类和元素,其中元素需要有关它们所在容器的知识。另外,创建应该通过容器中的工厂方法完成。如果你使用它很容易一个标题和一个cpp文件,如果你(像我一样)只允许使用一个标题,我似乎不可能。以下是问题的一个示例:
class myContainer;
class myElement;
class myContainer
{
public:
myElement *createElement()
{
myElement *me =new myElement(this);
// do some adding to list stuff
return me;
}
int askMyContainer()
{
return 42;
}
};
class myElement
{
public:
myElement(myContainer *parent)
{
pcontainer=parent;
}
int userAskingSomething()
{
return pcontainer->askMyContainer();
}
protected:
myContainer *pcontainer;
};
myContainer类需要有关myElement的知识,这就是为什么myElement会出现在myContainer之前,但是myElement需要有关myContainer的知识。
答案 0 :(得分:7)
您必须将类定义和方法定义拆分为至少一个类的单独部分。
例如,首先定义myContainer
类(即类及其变量/函数,但不这些函数的实现)。然后有myElement
类。请按照myContainer
成员函数的实际实现(如果您希望它们在头文件中标记为inline
)进行此操作。
答案 1 :(得分:2)
您可以使用其他文件拆分声明和定义以解析圆圈:
// File myContainer.h:
#include "myElement.h"
class myContainer
{
public:
myElement *createElement();
int askMyContainer();
};
#include "myElement.hcc"
// File myContainer.hcc:
#include "myElement.h"
// inline myContainer functions
// File myElement.h
class myContainer;
class myElement
{
public:
myElement(myContainer *parent);
int userAskingSomething();
protected:
myContainer *pcontainer;
};
#include "myElement.hcc"
// File myElement.hcc
#include "myContainer.h"
// inline myElement functions
答案 2 :(得分:0)
在写这个问题时,我有一个想法如何解决它,那就是继承。 像
class myContainerBase
{
pulbic:
int askMyContainer()
{
return 42;
}
};
//...
class myElement
{
public:
myElement(myContainerBase *parent)
{
pcontainer=parent;
}
//...
class myContainer:public my ContainerBase
{
//...
有没有人有更好的方法?或者可以吗?
Joachim Pileborg为我找到了最好的答案。在他的最后一句话中,我以前不知道。这是我在其他地方的工作实例: - )
class myContainer;
class myElement;
class myContainer
{
public:
myElement *createElement();
int askMyContainer()
{
return 42;
}
};
class myElement
{
public:
myElement(myContainer *parent)
{
pcontainer=parent;
}
int userAskingSomething()
{
return pcontainer->askMyContainer();
}
protected:
myContainer *pcontainer;
};
inline myElement *myContainer::createElement()
{
myElement *me =new myElement(this);
// do some adding to list stuff
return me;
}