麻烦我的.h文件

时间:2013-03-28 23:01:24

标签: c++ header include

这是我的两个类,Node和DobleNode,它们都在不同的.h文件中,并且它们都有自己的.cpp文件。

//"Node.h" 

class Node
{
public:

    Node(string pName, string pID);
    void setReferencia(DobleNode *pReferencia);
    DobleNode* getReferencia(void);

private:

    string Name;
    string ID;
    DobleNode *referencia;
};

//"DobleNode.h"

class DobleNode
{
public:

    DobleNode(string pBank_code, string pCard_type);
    void setReferencia(Node *pReferencia);
    Node* getReferencia(void);

private:

    string bank_code;
    string card_type;
    Node *referencia;
};

问题是我需要一个参考。在类Node中,必须存在DobleNode类型的属性,并且在类DobleNode中必须存在Node类型的属性。它似乎非常简单,我只需要在“Node.h”之前加入“DobleNode.h”,一切都会有效......

但如果我这样做,稍后,当我尝试编译我的小程序时,它表示标识符Node不存在。如果我以另一种方式执行,它会说同样的事情,但这次标识符DobleNode是不存在的。

我怎么能解决这个问题,我认为解决方案可能是将两个类放在同一个文件中,但我认为有更好的解决方法。 有没有办法“告诉”编译器同时检查“Node.h”和“DobleNode.h”,还是什么?

感谢您的回答。

BTW我正在研究Visual Studio 2010 Proffesional,C ++(显然)。

2 个答案:

答案 0 :(得分:5)

您可以转发声明一个类,因为您正在使用指针。

//"DobleNode.h"

class Node;   // DECLARED!  "Node.h" doesn't need to be included.

class DobleNode
{
    ...

//"Node.h" 

class DobleNode;   // DECLARED!  "DobleNode.h" doesn't need to be included.

class Node
{
    ...

答案 1 :(得分:1)

您遇到了问题,因为如果两个文件相互包含,则会导致无限循环包含。为避免这种情况,您的代码可能会在其中包含预编译器标头,告知它不包含已包含的代码。但是,这会导致您的某个类没有其他定义的

有两种解决方案。您可以按照Drew Dormann的描述进行前向声明。

但是我猜测你的目的是使用Node和DoubleNode继承的虚拟类可能更合适,因为你似乎每个都有类似的方法。这样可以避免重复使用常用方法的代码,并使编辑更容易。

例如

//"Node.h" 

class Node : public NodeBase
{
public:

private:

    string Name;
    string ID;
};

//"DobleNode.h"

class DobleNode : public NodeBase
{
public:

private:

    string bank_code;
    string card_type;
};

//"NodeBase.h" 

class NodeBase
{
public:

    Node(string pName, string pID);
    void setReferencia(NodeBase *pReferencia);
    NodeBase* getReferencia(void);

protected:
    NodeBase *referencia;
};