如何处理 return 个抽象对象
How to handle return of Abstract Objects
我面临以下情况:
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()
return 一个 Base 类型。我知道我可以使用指针或引用让编译器满意,但由于对象 ConcreteA 是在 exec()
中创建的,return 按值是避免悬空引用或具有未定义所有权的指针的最佳方法。
有没有办法避免使用指针或引用来处理这种情况?
这看起来像是 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();
}
当 main
中的 base_ptr
超出范围时,内存将自动删除。
请注意,我还使 Base
析构函数成为虚拟的。也许您只是为了简洁而在代码示例中将其遗漏了,但应该强调它的重要性,我认为即使在简短的示例代码中也应该保留它。
我面临以下情况:
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()
return 一个 Base 类型。我知道我可以使用指针或引用让编译器满意,但由于对象 ConcreteA 是在 exec()
中创建的,return 按值是避免悬空引用或具有未定义所有权的指针的最佳方法。
有没有办法避免使用指针或引用来处理这种情况?
这看起来像是 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();
}
当 main
中的 base_ptr
超出范围时,内存将自动删除。
请注意,我还使 Base
析构函数成为虚拟的。也许您只是为了简洁而在代码示例中将其遗漏了,但应该强调它的重要性,我认为即使在简短的示例代码中也应该保留它。