【发布时间】:2021-09-23 13:30:36
【问题描述】:
我正在尝试封装引擎实现类的细节。为此,我返回抽象类的std::unique_ptr(在我的情况下为IEngine)而不是Engine。但由于编译错误,我无法做到这一点。我可以返回原始参考并且它可以工作,但是unique_ptr 可以吗?提前致谢。
class IEngine
{
public:
virtual ~IEngine() = default;
virtual void Start() = 0;
};
class Engine : public IEngine
{
public:
void Start() override {}
};
class Car
{
std::unique_ptr<Engine> m_engine;
public:
std::unique_ptr<IEngine>& Get() { return m_engine; } // Here is compile error
};
int main()
{
Car lambo;
}
【问题讨论】:
-
注意:总是添加你的错误信息
-
将成员设为私有但从
Get返回非 const 引用的目的是什么? -
如果没有错误消息,我猜这个问题是在指针为
std::unique_ptr<Engine>时试图返回对std::unique_ptr<IEngine>的引用。由于类型不同,此处不会发生自动转换。此外,在这种情况下,我也不认为返回对 unique_ptr 的引用是一个好主意。 -
unique_ptr<Engine> != unique_ptr<IEngine>所以你不能只绑定对它的引用(从 Get 返回) -
Get()应该做什么?所有权转让?只允许(无限制)访问类中的对象(有点打破封装)
标签: c++ c++11 c++14 smart-pointers