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

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 中放置一个#include ,但它仍然给出does not name a type 的错误。 如果您正确查看代码,您可以看到我删除了 "Child.h" 并没有包含在 "Parent.h" 中,而是添加了前向声明 class Child;【参考方案3】:

使用类原型/前向声明:

class Child;

class Parent;

在彼此的类声明之前并删除包含。

【讨论】:

【参考方案4】:

的错误(在询问编译/链接器错误时,您应该始终包含 completeunedited 错误消息)是这一行:

a.do_parent(Child& arg);

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

b.do_parent(&a);

【讨论】:

【参考方案5】:

您需要有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 应该对你有很大帮助。

【讨论】:

以上是关于如何在两个类中双重引用子类和父类的主要内容,如果未能解决你的问题,请参考以下文章

外键和引用类如何在 Hibernate 实体中一起存在?

idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用

随机森林分类如何在幕后工作?

Java——super关键字

十面向对象之多态

关于子类和父类中的this的用法