标题声明“鸡肉或鸡蛋”

时间:2013-10-28 10:12:20

标签: c++ header

对于一个项目,我必须编写一个容器类和元素,其中元素需要有关它们所在容器的知识。另外,创建应该通过容器中的工厂方法完成。如果你使用它很容易一个标题和一个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的知识。

3 个答案:

答案 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;
}