- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个类(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();
};
前向声明适用于 test
和 testIn
,只要您不尝试使用这些指针即可。
现在在“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/
我是一名优秀的程序员,十分优秀!