C++ 在c+中使用友元类的私有构造函数处理类构造函数+;
在单词搜索示例程序中,我有抽象基类查询、句柄类查询和派生类WordQuery 句柄类是抽象基类和派生类的朋友,它的构造函数应该使用派生类的私有构造函数 以下是这些类的代码:C++ 在c+中使用友元类的私有构造函数处理类构造函数+;,c++,constructor,C++,Constructor,在单词搜索示例程序中,我有抽象基类查询、句柄类查询和派生类WordQuery 句柄类是抽象基类和派生类的朋友,它的构造函数应该使用派生类的私有构造函数 以下是这些类的代码: class Query_base { friend class Query; protected: typedef TextQuery::line_no line_no; virtual ~Query_base() { }; private: // eval returns the |set
class Query_base
{
friend class Query;
protected:
typedef TextQuery::line_no line_no;
virtual ~Query_base() { };
private:
// eval returns the |set| of lines that this Query matches
virtual std::set<line_no> eval (const TextQuery&) const = 0;
// display prints the query
virtual std::ostream& display (std::ostream& = std::cout) const = 0;
};
// handle class to manage the Query_base inheritance hierarchy
class Query
{
// these operators need access to the Query_base* constructor
friend Query operator~(const Query &);
friend Query operator|(const Query&, const Query&);
friend Query operator&(const Query&, const Query&);
public:
Query(const std::string&); // build a new WordQuery
// copy control to manage pointers and use counting
Query(const Query &c): q(c.q), use(c.use) { ++*use; }
~Query() { decr_use(); }
Query operator=(const Query&);
// interface functions: will call corresponding Query_base operations
std::set<TextQuery::line_no> eval (const TextQuery &t) const
{ return q->eval(t); }
std::ostream &display(std::ostream&os) const { return q->display(os); }
private:
Query(Query_base *query): q(query), use (new std::size_t(1)) { }
Query_base *q;
std::size_t *use;
void decr_use()
{
if (--*use == 0)
{
delete q;
delete use;
}
}
};
class WordQuery: public Query_base
{
friend class Query; // Query uses the WordQuery constructor
WordQuery(const std::string &s): query_word(s) { }
// concrete class: WordQuery defines all inherited pure virtual function
std::set<line_no> eval(const TextQuery &t) const
{ return t.run_query(query_word); }
std::ostream& display (std::ostream &os) const
{ return os << query_word; }
std::string query_word; // word for which to search
};
但编译器不让我这么做
请让我知道我做错了什么
对于那些可能面临类似问题的人,构造函数应该这样编写:
Query::Query(const std::string &s): q(WordQuery(s)) { };
Query::Query(const std::string &s)
{ q = new WordQuery(s); use = new std::size_t(1); }
q
是一个指针,您需要new
WordQuery@TartanLlama谢谢。