1

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

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...
}

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

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

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

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

4

1 回答 1

1

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

我重载了运算符[]以直接返回您的值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;
}
于 2021-05-06T16:26:46.300 回答