如何使用 std::make_unique 函数和接口 类?
How to work with std::make_unique function and interface classes?
假设我们要实现策略模式。我们有一个接口 Base
和两个派生的 classes -- A
和 B
。 Doer
class 的实例可以在 A
和 B
的方法 do()
之间进行选择。问题是如何完成代码以使其成为应有的样子。
class Base {
virtual void do() const = 0;
};
class A: public Base {
void do() const override {};
};
class B: public Base {
void do() const override {};
}
class Doer {
public:
Doer(std::unique_ptr<Base> b_ptr) : ptr(b_ptr) {}
void do() const { ptr->do(); }
private:
std::unique_ptr<Base> ptr;
}
int main() {
Doer doer(std::unique_ptr<Base>());
doer.do();
return 0;
}
Doer doer(std::make_unique<A>()); // or std::make_unique<B>()
以上就差不多了。 std::unique_ptr
非常努力地实现与它所持有的原始指针相同的强制转换。
您的代码存在三个主要问题。
1) do
是语言的关键字。您不能将其用作标识符(如函数名称)
2) 你按值取 b_ptr
,所以你需要从它移动:
Doer(std::unique_ptr<Base> b_ptr) : ptr(std::move(b_ptr)) {}
3) 你传递了一个空的unique_ptr
给Doer
的构造函数,相当于传递了一个nullptr
。您还尝试实例化基础 class。不可能,因为Base
是纯虚的class。将 make_unique
与派生类型一起使用:
Doer doer(std::make_unique<A>());
假设我们要实现策略模式。我们有一个接口 Base
和两个派生的 classes -- A
和 B
。 Doer
class 的实例可以在 A
和 B
的方法 do()
之间进行选择。问题是如何完成代码以使其成为应有的样子。
class Base {
virtual void do() const = 0;
};
class A: public Base {
void do() const override {};
};
class B: public Base {
void do() const override {};
}
class Doer {
public:
Doer(std::unique_ptr<Base> b_ptr) : ptr(b_ptr) {}
void do() const { ptr->do(); }
private:
std::unique_ptr<Base> ptr;
}
int main() {
Doer doer(std::unique_ptr<Base>());
doer.do();
return 0;
}
Doer doer(std::make_unique<A>()); // or std::make_unique<B>()
以上就差不多了。 std::unique_ptr
非常努力地实现与它所持有的原始指针相同的强制转换。
您的代码存在三个主要问题。
1) do
是语言的关键字。您不能将其用作标识符(如函数名称)
2) 你按值取 b_ptr
,所以你需要从它移动:
Doer(std::unique_ptr<Base> b_ptr) : ptr(std::move(b_ptr)) {}
3) 你传递了一个空的unique_ptr
给Doer
的构造函数,相当于传递了一个nullptr
。您还尝试实例化基础 class。不可能,因为Base
是纯虚的class。将 make_unique
与派生类型一起使用:
Doer doer(std::make_unique<A>());