【问题标题】:C++ classes using eachotherC++ 类相互使用
【发布时间】:2013-05-10 12:45:16
【问题描述】:

我有两个类,假设 A 类和 B 类。我的目标是让两个类都使用彼此的功能。问题是,多文件包含结构似乎不允许我这样做。这是我正在尝试做的事情:

#file A.h

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#file B.h

Class B{
public:
   int getStuff();
private:
   A * ptrToA;
};

我的目标是让 A 类方法能够调用 ptrToB->getStuff(),让 B 类方法能够调用 ptrToA->getInfo()

这可能吗?为何如此?如果没有,为什么不呢?

【问题讨论】:

  • 其他人已经指出了让它编译的方法,但问问自己为什么你的类需要如此耦合。要么让它成为一类,要么把正确的数据放在正确的类上。不要使用吸气剂。告诉有数据的班级用这些数据做正确的事。查找 Data Envy 和其他人。

标签: c++ object circular-dependency


【解决方案1】:

也许使用前向声明?

#file A.h

#ifndef ACLASS_H
#define ACLASS_H

Class B;

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#endif

然后在 CPP 文件中。

#file A.cpp

#include "B.h"

A::A() : ptrToB(0)
{
  // Somehow get B
}

int A::GetInfo() 
{
  // Return whatever you need in here.
}

对 B 类 H 和 CPP 文件执行相同的操作。

前向定义允许编译器无需显式定义即可识别类型。如果您在 A 类中引用了 B,则必须包含 B 的标题。

由于您使用指针来访问 B,编译器不需要知道内部数据,直到您访问它(在 CPP 文件中)。

// Would need the header because we must know 
// the size of B at compile time.
class B;
class A 
{
  B theB; 
}


// Only need forward declaration because a 
// pointers size is always known by the compiler
class B;
class A
{
  B * bPointer; 
}

【讨论】:

  • 谢谢,它有效!我之前尝试过这个,除了我尝试从 B.h 文件中的内联函数调用 aPointer->AMemberFunc() 。我猜这个的关键是头文件中的前向声明,然后是 .cpp 文件中的包含?这是为了避免循环依赖吗?
  • 是的,你可以这样做来隐藏某些东西的实现并避免循环依赖。
  • 我只有一个 .cpp 文件,是否可以在一个文件中同时写入两个类?
  • 我不确定你的意思?你想转发声明这两个类吗?如果是这样,那是有效的。否则给我一个例子或提出一个新问题。
【解决方案2】:

只需向文件 A.h 添加一个前向声明,这样编译器就知道 B* 是指向您稍后将定义的类的指针:

class B;

然后定义您的 class A 并在之后包含 B.h。这样,包括 A.h 在内的任何人都将同时定义 class Aclass B

在 B.h 中,只需在开头包含 A.h。这样,包括 B.h 在内的任何人都将同时定义 class Aclass B

当您在关联的 .cpp 文件中定义函数时,您将拥有两个可用的类,并且可以根据需要编写函数。

这个问题叫做mutual recursion

【讨论】:

  • +1 用于解释,而不仅仅是准备使用的代码...(当然也可以;))很好的答案。
【解决方案3】:

您可以使用前向声明来打破依赖关系:

#file A.h

Class A{
public:
    int GetInfo();

private:
    B * ptrToB;
};

#file B.h
struct A;
Class B{
public:
   int getStuff();
private:
   A * ptrToA;
};

那么你可以在 B.cpp 中包含 A.h 并在 A.cpp 中包含 B.h 没有问题。

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2011-02-02
    相关资源
    最近更新 更多