我面临以下情况:
class Base{
virtual void Stuff() = 0;
};
class ConcreteA : public Base{
void Stuff() {};
};
class ConcreteB : public Base{
void Stuff() {};
};
class Context {
Base exec() {
ConcreteA conc_a();
return a;
}
};
当然编译器给我一个错误,因为Base
是抽象的。但是,我需要exec()
返回一个Base类型。我知道我可以使用指针或引用使编译器满意,但由于对象ConcreteA是在exec()
中创建的,因此按值返回是避免悬挂引用或指向未定义所有权的最佳方法。
有没有办法避免使用指针或引用来处理这种情况?
答案 0 :(得分:3)
这看起来像std::unique_ptr
的完美,简单的用例。这是一个C ++ 14示例:
#include <memory>
#include <iostream>
class Base{
public:
virtual ~Base() {}
virtual void Stuff() = 0;
};
class ConcreteA : public Base{
void Stuff() { std::cout << "ConcreteA::Stuff\n"; };
};
class ConcreteB : public Base{
void Stuff() { std::cout << "ConcreteB::Stuff\n";};
};
class Context {
public:
std::unique_ptr<Base> exec() {
return std::make_unique<ConcreteA>();
}
};
int main()
{
Context c;
auto base_ptr = c.exec();
base_ptr->Stuff();
}
当base_ptr
中的main
超出范围时,内存会自动删除。
请注意,我还将Base
析构函数设为虚拟。也许你只是为了简洁起见在代码示例中将其遗漏了,但是应该强调它的重要性,我认为它应该保留在简短的示例代码中。