如下所示,这本书前面告诉我尽量用make_shared初始化shared_ptr,这章中为何都是用new来初始化呢?难道是因为忘记更新第5版这章中的c++11的改动了吗?
class Query
{
friend Query operator~(const Query&);
friend Query operator|(const Query&, const Query&);
friend Query operator&(const Query&, const Query&);
public:
//! build a new WordQuery
Query(const std::string& s) : q(new WordQuery(s)) //就是这里
{
std::cout << "Query::Query(const std::string& s) where s=" + s + "\n";
}
//! interface functions: call the corresponding Query_base operatopns
QueryResult eval(const TextQuery& t) const
{
return q->eval(t);
}
std::string rep() const
{
std::cout << "Query::rep() \n";
return q->rep();
}
private:
//! constructor only for friends
Query(std::shared_ptr query) :
q(query)
{
std::cout << "Query::Query(std::shared_ptr query)\n";
}
std::shared_ptr q;
};
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
是为了动态绑定,make_shared<WordQuery>得到的是WordQuery类型shared指针,无法实现从Query_base到WordQuery的动态绑定。
q(std::make_shared<WordQuery>(s))报错的原因是初始化参数不对,把s改成WordQuery(s)可以编译通过,但是是静态绑定,无法实现设计目标。
顺便一提,即便用make_shared<Query_base>(WordQuery(s))实现指针也不行,会报错。即便派生类可以转换,派生类对象也会塌陷为基类对象,而丢弃派生类成员。依然无法实现程序设计目标。