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



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

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声明?

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

这是一个丑陋的答案,但却是一个答案,解决了"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;
}

最新更新