避免共享基础状态的成员访问

avoid member access for shared base state

假设我有一个作为抽象接口的基 class,以及两个从基 class 继承某种状态的派生 class。我想更改我在 运行 时使用的派生 class,但我想保留共享状态。

class Base{
public:
virtual void abstract() = 0;
SharedState ss;
};

class Der1 : public Base{
Der1() = default;
virtual void abstract() {//bla bla};
Der1(SharedState &s){
ss = s;};
};

class Der2 : public Base{
Der2() = default;
virtual void abstract(){//bla bla 2};
Der2(SharedState &s){
ss = s;};
};

struct SharedState{
int x,y,z;
float x1,y1,z1; 
//etc...
}

我的处理程序代码,我有一个智能指针,可以在 运行 时间根据 class 类型更改行为,因此共享状态构造函数。

 //driver code
std::unique_ptr<Base> ptr = std::make_unique<Der1>();

我打算更改类型,但有了这样的构造函数,我可以保留状态。然而,在共享状态的每个成员前面加上 ss. 是非常烦人的,有没有办法避免这种情况,也许使用某种 using 声明?

编辑:我知道我可以移动基础中的共享状态并将其设为静态,但是当我不使用此接口时这会导致性能下降。

这是一个丑陋的答案,但它是一个解决了“ss”问题并且很有用的答案。

我重载了运算符 [] 以直接 return 您的 struct

的值
struct SharedState{
int x,y,z;
float x1,y1,z1; 
//etc...
};


class Base{
public:
virtual void abstract() = 0;
SharedState ss;
public:
  int& operator[](const std::string rhs) 
  {                          
    if(rhs == "x") //Here you will manage all the struct members, probably a map
    return this->ss.x; // return the result by reference
  }
};

class Der1 : public Base{
void abstract() override { };
public:
Der1(SharedState &s){
ss = s;};
};

class Der2 : public Base{
void abstract() override { };
public:
Der2(SharedState &s){
ss = s;};
};



int main()
{
  SharedState ss;
  ss.x = 100;
  std::unique_ptr<Base> ptr = std::make_unique<Der1>(ss);
  
  std::cout << (*ptr)["x"] << std::endl;
  (*ptr)["x"] = 5; // You can change it too 
  std::cout << (*ptr)["x"] << std::endl;
  
  std::unique_ptr<Base> ptr2 = std::make_unique<Der2>(ptr->ss);
  std::cout << (*ptr2)["x"] << std::endl;
}