gpt4 book ai didi

c++ - 如何包装一个类然后调用它的方法?

转载 作者:行者123 更新时间:2023-11-27 22:42:06 26 4
gpt4 key购买 nike

目标是拥有一个可以改变其行为的对象。
我的对象是包装器,它应该调用 One::handler() 并输出“One”,但它从 Situation::handler() 输出“来自虚拟处理程序”。
我没有写更改方法,因为我卡在这里。

#include <iostream>

class Situation
{
public:
virtual void handler()
{
std::cout<<"from virtual handler()";
}
};

class Wrap
{
private:
Situation _sit;
public:
Wrap(Situation sit)
{
_sit = sit;
}
void call()
{
_sit.handler();
}

};

class One : public Situation
{
public:
void handler()
{
std::cout<<"One"<<std::endl;
}
};

int main()
{
One first;
Wrap wrapper(first);
wrapper.call();
return 0;
}

最佳答案

由于 object slicing,您不能包装按值传递的多态对象.您的 Wrapper 需要有一个指向它所包装的对象的指针或引用。

这是一个使用引用的实现:

class Wrap
{
private:
Situation& _sit;
public:
Wrap(Situation& sit) : _sit(sit)
{
}
void call()
{
_sit.handler();
}
};

请注意,此实现与您的原始实现几乎相同,在两个位置添加了 &,并且初始化列表用于设置 _sit 引用。然而,它是脆弱的,因为您必须确保 _sit 引用的对象的生命周期延伸到使用其 Wrapper 的最后一点。

包装器的更健壮的实现将使用智能指针来动态分配对象。

关于c++ - 如何包装一个类然后调用它的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48032893/

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