避免共享基础状态的成员访问
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;
}
假设我有一个作为抽象接口的基 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;
}