如何使A类成为B类的成员而不继承它?

Con*_*der 2 c++ inheritance class undeclared-identifier c++11

我有两节课(实际上是四节课,但它们不是必需的)。让我们称它们为 A 和 B。我试图将类 B 声明为类 A 中的成员。我的问题是,我需要从类 B 访问类 A 内部的成员函数,但这对于这些没有意义两个类可以互相继承。

这是两个类:

A类:

#include "B.h"

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

};
Run Code Online (Sandbox Code Playgroud)

B类:

#include "A.h"


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

        // member functions
};

Run Code Online (Sandbox Code Playgroud)

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

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

我知道,将其中一个类作为另一个类的子类将允许子类访问父类的公共和受保护成员。

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

感谢您抽出时间查看我的问题。


更新:约翰在他自己提交的内容下面发布的解决方案对于我原来的问题是正确的。我只是个白痴,忘记了 A 类也继承自另一个类。

A 类如下所示:

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

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

};
Run Code Online (Sandbox Code Playgroud)

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

joh*_*ohn 6

您有一个循环包含问题,“Ah”包含“Bh”,“Bh”又包含“Ah”。仔细想想,“Ah”立即包含“Bh”,而“Bh”又立即包含“Ah”,但这次“Ah”被跳过(因为它之前已包含在内,即使尚未完全处理),这意味着您是B在尚未看到类声明的情况下处理类A

以下是打破这个循环的方法。

“啊”还是和以前一样

#include "B.h"

class AnotherClass
{
};

class A : AnotherClass {
    B test;
public:
    A() : test {this} {}
    void something();
};
Run Code Online (Sandbox Code Playgroud)

但是“Bh”使用前向声明来打破循环

class A; // forward declaration

class B: public Alert {
    A* test;
public:
    B() = default;
    B(A* testIn) : test{ testIn } {}
    void member_function();
};
Run Code Online (Sandbox Code Playgroud)

前向声明适用于testtestIn您不尝试使用这些指针,

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

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

void B::member_function()
{
    ...
    test->something();
    ...
}
Run Code Online (Sandbox Code Playgroud)