如何在两个类中双重引用子类和父类

时间:2013-02-11 08:57:18

标签: c++ c oop

如何正确引用两个对象中的子对象和父对象(双向链接的子对象和父对象)?这样做时,我收到编译错误:**** does not name a type。我怀疑它与由于#define标签而被省略的#include语句有关。这些标签应该如何包括在内?

这三个文件(Parent.h,Child.h,main.cpp)写成:

    /* Parent.h */
#pragma once
#ifndef _CHILD_CLS
#define _CHILD_CLS

#include "Child.h"

class Parent {
public:
    Parent() {}
    ~Parent() {}
    void do_parent(Child* arg);
};
#endif

/* Child.h */
#pragma once
#ifndef _CHILD_CLS
#define _CHILD_CLS

#include "Parent.h"

class Child {
public:
    Child() {}
    ~Child() {}
    void do_child(Parent* arg);
};
#endif

/* main.cpp */
#include "child.h"
#include "parent.h"

int main()
{
    Child   a();
    Parent  b();
    a.do_parent(Child& arg);
    return 0;
}

5 个答案:

答案 0 :(得分:1)

您对头文件有循环依赖关系。只需在其中一个标头中声明其中一个类。例如:

    /* Parent.h */
#pragma once
#ifndef _CHILD_CLS
#define _CHILD_CLS

//#include "Child.h"   ----> Remove it
class Child;           //Forward declare it

class Parent {
public:
    Parent() {}
    ~Parent() {}
    void do_parent(Child* arg);
};
#endif

答案 1 :(得分:1)

使用类原型/前向声明:

class Child;

class Parent;

在每个其他类声明之前删除包含。

答案 2 :(得分:1)

您定义了两个函数而不是对象,请参阅most vexing parse

更新

Child   a();              // a is a function returns Child object
Parent  b();              // b is a function returns Parent object
a.do_parent(Child& arg);

Child   a;           // a is a Child object
Parent  b;           // b is a Parent object
b.do_parent(&a);

另外,你有circular include问题,要打破循环包含,你需要转发一种类型:

Child.h

#pragma once
#ifndef _CHILD_CLS
#define _CHILD_CLS

//#include "Parent.h"  Don't include Parent.h
class Parent;           // forward declaration
class Child {
public:
    Child() {}
    ~Child() {}
    void do_child(Parent* arg);
};
#endif

Child.cpp

#include "Parent.h"
// blah

答案 3 :(得分:0)

错误,我猜测(在询问编译/链接器错误时,您应该始终包含完整的未编辑的错误消息),这一行:

a.do_parent(Child& arg);

你应该在这里传递指向Child对象的指针,而不是变量声明:

b.do_parent(&a);

答案 4 :(得分:0)

您需要class Parentclass Child转发声明。尝试修改一个文件。

在你的Parent.h:

#pragma once
#ifndef _CHILD_CLS
#define _CHILD_CLS

class Child;     // Forward declaration of class Child

class Parent {
public:
    Parent() {}
    ~Parent() {}
    void do_parent(Child* arg);
};
#endif

或在你的Child.h:

#pragma once
#ifndef _CHILD_CLS
#define _CHILD_CLS

class Parent;    // Forward declaration of class Parent

class Child {
public:
    Child() {}
    ~Child() {}
    void do_child(Parent* arg);
};
#endif

This question应该对你有所帮助。