如何正确引用两个对象中的子对象和父对象(双向链接的子对象和父对象)?这样做时,我收到编译错误:**** 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;
}
答案 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 Parent
或class 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应该对你有所帮助。