1

这是我的两个类,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”,或者什么?

感谢您的回答。

顺便说一句,我正在使用 Visual Studio 2010 Proffesional,C++(显然)。

4

3 回答 3

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
{
    ...
于 2013-03-28T23:04:33.063 回答
2

放“类节点;” 和“类 DobleNode;” 在一个/两个标题的顶部。

例如(带结构)

struct node1;
struct node2;

struct node1 { struct node2 *p; };
struct node2 { struct node1 *p; };

它与类相同。

于 2013-03-28T23:04:07.720 回答
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;
};
于 2013-03-28T23:10:48.087 回答