访问姐妹类的实例
Access instance of a sister class
我正在尝试创建一个以三个类为成员的结构,为了实现我的想法,我希望我的类的实例能够访问一个结构中的姐妹实例。假设在初始化struct
之后,我希望我的custom_class_one
能够调用初始化的sister custom_class_two
的方法。有可能做到吗?这是我的头文件:
struct custom_wrapper
{
public:
custom_wrapper();
class custom_class_one
{
private:
int number1;
public:
int getNumber1();
};
class custom_class_two
{
private:
int number2;
public:
int getNumber2();
};
class custom_class_three
{
private:
int number3;
public:
int getNumber3();
};
};
只要您的方法是可访问的,并且类之间可以相互查看(如果需要,可以向前声明),就可以完成:
struct custom_wrapper
{
public:
custom_wrapper();
class custom_class_two; // Forward declaration for inner class
class custom_class_one
{
private:
int number1;
public:
int getNumber1();
int accessSisterMethods(custom_class_two& obj) {
return obj.getNumber2();
}
};
class custom_class_two
{
private:
int number2;
public:
int getNumber2() {
return 42;
}
};
class custom_class_three
{
private:
int number3;
public:
int getNumber3();
};
};
int main()
{
custom_wrapper::custom_class_one obj1;
custom_wrapper::custom_class_two obj2; // Need a sister object
std::cout << obj1.accessSisterMethods(obj2);
}
示例
当然,您需要另一个姐妹类的实例(除非您正在调用静态方法,但我正在考虑您发布的代码)。
根据您的评论,我认为您混淆了一些概念:组合、嵌套类和实例。或者我误解了你的问题,将删除/编辑我的答案。
当你说"一个结构中姐妹的实例"时,我认为你真的在寻找组合。就像在中有一个关系。您不需要有嵌套类就可以进行组合。对于组合,您需要成员变量。
也许你真正想要的是这样的东西,如果我错了,请纠正我:
struct CustomClassA {
private:
int number;
public:
int getNumber() { return number; }
};
struct CustomClassB {
private:
int number;
public:
int getNumber() { return number; }
};
struct CustomClassC {
private:
int number;
public:
int getNumber() { return number; }
};
struct CustomWrapper {
private:
CustomClassA a;
CustomClassB b;
CustomClassC c;
};
因此,如果创建一个CustomWrapper
的实例,则具有自定义类a
、b
和c
的实例。它"拥有"它们。
然后您希望这三个自定义类能够相互通信。实现这一点有很多方法。自定义类可以具有指向其他姐妹类的指针。这些可以在CustomWrapper
:的构造函数中设置
#include <iostream>
struct CustomClassB; // Forward declaration for member pointer in CustomClassA.
struct CustomClassA {
private:
int number;
CustomClassB* b; // Member pointer to CustomClassB.
public:
CustomClassA() : number(1), b(nullptr) {} // Initialized sister b to nullptr.
void setSisterB(CustomClassB *sister_b) { b = sister_b; }
int getNumber() { return number; }
};
struct CustomClassB {
private:
int number;
CustomClassA* a;
public:
CustomClassB() : number(2), a(nullptr) {}
void setSisterA(CustomClassA *sister_a) { a = sister_a; }
int getNumber() {
if (a) // Check a is not null
return a->getNumber() + number; // Use pointer to sister a
return number;
}
};
struct CustomClassC {
private:
int number;
CustomClassA* a;
CustomClassB* b;
public:
CustomClassC() : number(4), a(nullptr), b(nullptr) {}
void setSisterA(CustomClassA* sister_a) { a = sister_a; }
void setSisterB(CustomClassB* sister_b) { b = sister_b; }
int getNumber() { return number; }
};
struct CustomWrapper {
private:
CustomClassA a;
CustomClassB b;
CustomClassC c;
public:
CustomWrapper() {
a.setSisterB(&b); // Set the pointers to the sister custom
b.setSisterA(&a); // classes in each custom class in the
c.setSisterA(&a); // constructor of CustomWrapper.
c.setSisterB(&b);
}
int getAnswer() {
return b.getNumber() + c.getNumber();
}
};
int main() {
CustomWrapper wrapper;
std::cout << wrapper.getAnswer();
}
或者,自定义类可以有一个指向自定义包装器的指针,并通过包装器与它们的姐妹进行通信。
相关文章:
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 正在生成未知类实例
- 从DLL中删除类的实例
- 在std::vector上存储带有模板的类实例
- 访问姐妹类的实例