如何在两个类中双重引用子类和父类
Posted
技术标签:
【中文标题】如何在两个类中双重引用子类和父类【英文标题】:How to doubly reference child and parent classes within both classes 【发布时间】:2013-02-11 08:57:17 【问题描述】:如何在两个对象(双重链接的子对象和父对象)中正确引用子对象和父对象?这样做时,我得到一个编译错误:**** 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;
【问题讨论】:
【参考方案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 问题,要打破循环包含,您需要转发一种类型:
孩子.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
【讨论】:
天啊!谢谢。那行得通。但是,如果 Child 的实例在 Parent 中,是否有任何方法(除了指针)可以访问该 Child 实例? Child 可以成为 Parent 的成员,但您仍然需要注意循环包含问题 :)【参考方案2】:你有头文件的循环依赖。只需在其中一个标头中前向声明任一类即可。例如:
/* 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
【讨论】:
谢谢。应该怎么做,例如是否在 Child 标头中声明 #include "Parent.h",在 Parent 标头中声明 #include "Child.h"? @toiletfreak:我已经展示了如何操作的代码示例。 我试图在 Parent.h 中放置一个#includedoes not name a type
的错误。"Child.h"
并没有包含在 "Parent.h"
中,而是添加了前向声明 class Child;
。【参考方案3】:
使用类原型/前向声明:
class Child;
和
class Parent;
在彼此的类声明之前并删除包含。
【讨论】:
【参考方案4】:我猜的错误(在询问编译/链接器错误时,您应该始终包含 complete 和 unedited 错误消息)是这一行:
a.do_parent(Child& arg);
你应该在这里传递一个指向Child
对象的指针,而不是一个变量声明:
b.do_parent(&a);
【讨论】:
【参考方案5】:您需要有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 应该对你有很大帮助。
【讨论】:
以上是关于如何在两个类中双重引用子类和父类的主要内容,如果未能解决你的问题,请参考以下文章
idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用