gpt4 book ai didi

c++ - 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅

转载 作者:行者123 更新时间:2023-11-30 05:11:14 27 4
gpt4 key购买 nike

如何使系统 ( SystemB1 ) 访问另一个系统 ( SystemA::sub ) 的字段,就好像它是自己的字段一样?

  • SystemA是一个拥有自己领域的实用系统 Sub* sub .
  • SystemB1 - SystemB5是要访问 SystemA::sub 的系统很容易。
  • 还有其他系统,但与SystemA无关或任何 SystemB . (未显示)

这是一个有效的 MCVE .

class SystemA;
class SystemB1;
class Core{
public:
SystemA* systemA=nullptr;
SystemB1* systemB1=nullptr;
//SystemB2,B3,B4,B5
};
//"SystemA.h"
class Sub1{
public: void f(){std::cout<<"OK"<<std::endl;}
//has 10-20 function
};
class SystemA : public Core{
public: Sub1* sub1=new Sub1();
//has 5-10 subsystems (Sub1 Sub2 Sub3 ...)
};
//"SystemB1.h"
class SystemB1 : public Core{
public: void fB1();
};
//"SystemB1.cpp" , include "SystemA.h"
void SystemB1::fB1(){
systemA->sub1->f(); //<--- Can it be more concise like `sub->f()` ?
}

注意:-(以防万一)

  • 在实际情况中,它使用服务定位器模式(1 个系统~ 1 个服务)和Sub1* sub1不是指针但有 operator->() .
  • 在真实案例中,Sub1是一种丑陋的模板类型,例如Sub<std::unordered_map<EnemyShip,Turret>> .因此,引用 sub1 类型的最方便方式(如果需要)是使用 decltype .

问题

是否有任何设计模式/C++ 魔术(宏除外)来缩写 systemA->sub1->f();更短的东西,比如 sub1->f();

对不起,如果这似乎是一个非常微不足道的问题。
我想提高我的技能和生产力——每一件小事都有帮助。

我糟糕的解决方案

我找到的唯一解决方案是为 SystemB1,B2,... 创建一个 类名为 SystemB .

//need #include SystemA
class SystemB : public Core{
//Solution 1 : cached from SystemA's
public: decltype(SystemA::sub1.operator->()) sub1;
// decltype(SystemA::sub2.operator->()) sub2;

//Solution 2 :
public: decltype(SystemA::sub1.operator->()) getSub1();
// decltype(SystemA::sub2.operator->()) getSub2();
};

然后,SystemB1,B2...可以调用sub1->f1()getSub1()->f1()直接。

缺点:

  • 每当我添加一个新的 subXSystemA :-

    • (解决方案 1)我必须创建一个新字段 SystemB::subX并用正确的指针设置它。
    • (解决方案 2)我必须添加 SystemB::getSubX()正确实现。
  • 非常难看。 decltype是需要的,因为如果我声明 Sub1* sub1里面SystemB :-

    • 每当我更改 SystemA::sub1 的类型时例如来自 Sub<std::unordered_map<EnemyShip,Turret>>Sub<std::unordered_map<EnemyShip,Tracker>>SystemA我还必须在 SystemB 中更改字段类型或返回函数类型这会导致一些可维护性问题。

最佳答案

class SystemA : public Core
{
public:
Sub1 *sub1 = new Sub1();
//has 5-10 subsystems (Sub1 Sub2 Sub3 ...)
static SystemA &GetInstance();
};

SystemA &SystemA::GetInstance()
{
static SystemA sa;
return sa;
}

//"SystemB1.h"
class SystemB1 : public Core
{
private:
SystemA *systemA;
public:
void SystemB1()
{
// use this
systemA = new SystemA(...);
// or this
systemA = &SystemA::GetInstance();
}
void fB1();
};

//"SystemB1.cpp" , include "SystemA.h"
void SystemB1::fB1()
{
systemA->sub1->f(); //<--- Can it be more concise like `sub->f()` ?
}

第一个对象 SystemA 总是通过调用 GetInstance 创建。

例如:

SystemA *m_mainSystem = &SystemA::GetInstance();

此外,查看用 C++ 编写的系统代码 FFmpeg .

关于c++ - 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45156835/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com