c++ - 如何在不继承 A 类的情况下使 A 类成为 B 类的成员?

标签 c++ class c++11 inheritance undeclared-identifier

我有两个类(class)(实际上是四个类(class),但这不是必需的)。我们称它们为 A 和 B。 我正在尝试将 B 类声明为 A 类的成员。 我的问题是,我需要从类 B 访问类 A 内部的成员函数,但是这两个类相互继承是没有意义的。

这是两个类:

A 类:

#include "B.h"

class A {
    B test;
public:
    A() : test {this} {}

};

B 类:

#include "A.h"


class B: public Alert {
    A* test;
public:
    B() = default;
    B(A* testIn) : test{ testIn } {}

        // member functions
};

我使用的是 Visual Studio Community Edition 2022(64 位)。 我的 C++ 版本是 C++11。

我不断收到的编译器错误是“testIn 未声明的标识符”。 这对我来说毫无意义,因为我觉得我已经宣布了。

我知道让其中一个类成为另一个类的子类将允许子类访问父类的公共(public)和 protected 成员。

问题是,在这种情况下,它们相互继承是没有意义的。我只需要从 B 类访问 A 类内部的函数,因为 A 类继承自另一个类。 我正在尝试编写一个库,并希望 A 类成为其他人可以使用的类。将 B 类作为要在最终程序中使用的类是没有任何意义的。这就是为什么我不想从另一个继承一个。

非常感谢您花时间查看我的问题。


更新: John 在他自己的提交中发布的解决方案对于我的原始问题是正确的。我只是个白痴,忘了包括 A 类也继承自另一个类。

A 类如下所示:

#include "AnotherClass.h"
#include "B.h"

class A: AnotherClass {
    B test;
public:
    A() : test {this} {}

};

非常抱歉我的困惑。我绝对搞砸了。

最佳答案

你有一个循环包含问题,“A.h”包含“B.h”,“B.h”又包含“A.h”。仔细想一想,“A.h”立即包含“B.h”,“B.h”又立即包含“A.h”,但这次“A.h”被跳过了(因为它之前已经包含,即使还没有完全处理)这意味着你是处理类 B,但尚未看到类 A 的声明。

这里是您可以打破循环的方法。

“A.h”和以前一样

#include "B.h"

class AnotherClass
{
};

class A : AnotherClass {
    B test;
public:
    A() : test {this} {}
    void something();
};

但是“B.h”使用前向声明来打破循环

class A; // forward declaration

class B: public Alert {
    A* test;
public:
    B() = default;
    B(A* testIn) : test{ testIn } {}
    void member_function();
};

前向声明适用于 testtestIn,只要您不尝试使用这些指针即可。

现在在“B.cpp”中你可以调用A方法。

#include "B.h"
#include "A.h"

void B::member_function()
{
    ...
    test->something();
    ...
}

关于c++ - 如何在不继承 A 类的情况下使 A 类成为 B 类的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74906082/

相关文章:

c++ - OpenCV 断言失败 - convertTo

c++ - 一起使用 SDL、OpenGL 和 Qt

python - 在 python 属性 setter 中传递两个参数

c++ - 如何预期 static_assert 失败并使用 Boost.Test 框架处理它?

c++ - 使用 C++11 的可移植定时代码的正确方法

c++ - 未初始化的局部变量

c++ - 抽象基类调用父类的纯虚函数

java - Java 5 或更早版本中的抽象类

Javascript:如何获取实例化某个对象的类?

c++ - 将相同的功能应用于每个数据成员 - 对异构类型进行转换之类的事情