C++ 中的共存类

Posted

技术标签:

【中文标题】C++ 中的共存类【英文标题】:Co-existent classes in C++ 【发布时间】:2013-06-21 17:21:35 【问题描述】:

我需要创建两个相互使用的类。

例如:

Class A 包含Class B 类型的对象,Class B 包含Class A 类型的对象

但是,当我编译时,会发生这种情况:“错误:ISO C++ 禁止声明没有类型的 'Map'”

我修改了我的类,将 Header (.h) 文件分开,但没有解决。

也许,这是一个基本问题,但我不知道在谷歌上搜索的关键字......

代码:

细胞.h:

Class Cell

public:
    Map *map;

地图.h:

Class Map

public:
    Cell *cell;

【问题讨论】:

“包含”是什么意思?显然,AB 不能将彼此的实例作为成员... 是的,他们可以@OliCharlesworth ... @IvanSeidel:他们绝对不能,因为那会导致无限递归。但是,它们可以指向引用彼此实例的成员(例如通过map)。 您发布了代码链接,而不是代码。一个好的问题有一个简化版本的代码,它仍然演示了你想要讨论的问题。另见sscce.org。 @IvanSeidel 它们不能包含彼此的实例。他们能做的最好的事情就是持有指向其他实例的引用或指针。很不一样 【参考方案1】:

你想要前向声明和指针。

//a.h
class B; //forward declare than a class B, exist somewhere, although it is not completely defined.

class A
 map<string,B*> mapOfB;
;

//b.h
class A; //forward declare than a class A, exist somewhere, although it is not completely defined.
class B
 map<string,A*> mapOfA;

在您的 .cxx 中,您实际上会包含必要的标题

//a.cxx
#include "b.h"
A::A() /* do stuff with mapOfB */ 

//b.cxx
#include "a.h"
B::B() /* do stuff with mapOfA */ 

【讨论】:

共享指针在这里会是更好的选择,但要小心循环引用。 是的,但只是保持简单/简单,例如 啊,伙计们……这没什么大不了的。对于一个简单的例子来说太混乱了。 Plus 用户尚未指定 C++11 或 boost 的可用性...【参考方案2】:

你的问题是你有递归包含。 Cell.h 包括 Map.h,其中包括 Cell.h。而不是像这样包含只是向前声明类:

Cell.h:

class Map;

class Cell

    // ...

Map.h:

class Cell;

class Map

    // ...

【讨论】:

【参考方案3】:

如果class A 包含class B 并且class B 也包含class A,那么不,您不能这样做。

class B; // forward declaration of name only. Compiler does not know how much
         // space a B needs yet.

class A 
    private:
        B b; // fail because we don't know what a B is yet.
;

class B 
    private:
        A a;
;

即使这样可行,也无法构造任何一个实例。

B b; // allocates space for a B
     // which needs to allocate space for its A
     // which needs to allocate space for its B
     // which needs to allocate space for its A
     // on and on...

然而,它们可以包含彼此的指针(或引用)。

class B; // forward declaration tells the compiler to expect a B type.

class A 
    private:
        B* b; // only allocates space for a pointer which size is always
              // known regardless of type.

;

class B 
    private:
        A* a;
;

【讨论】:

以上是关于C++ 中的共存类的主要内容,如果未能解决你的问题,请参考以下文章

在c语言中怎样用c++类中的对象调用c++类中的方法?

C++:mwArray 作为 C++ 类中的变量

C++ 类中的 Getline

类中的字符串 // C++

为啥在 C++ 中的类中不需要“&”引用?

在 C++ 中的多个类中使用模板类