练习15.41在c ++入门书第4期

时间:2010-11-07 14:10:25

标签: c++ class constructor

class Query{
    friend Query operator&(const Query&,const Query&);
    friend Query operator|(const Query&,const Query&);
    friend Query operator~(const Query&);
public:
    Query(const string&);           //build a new WordQuery ??
    Query(const Query&c):p(c.p),use(c.use){++*use;}
    ~Query(){delQuery();}
    Query operator=(const Query&c);
    set<TextQuery::line_no> eval(const TextQuery&c) const{return p->eval(c);}
    ostream& display(ostream&s) const {return p->display(s);}
private:
    Query(QueryBase *query):p(query),use(new size_t(1)){}
    QueryBase *p;
    size_t* use;
    void delQuery(){
        if(--*use==0)
            delete p;
            delete use;
    }
};

class WordQuery:public QueryBase{
    friend class Query;
    WordQuery(const string& s):QueryWord(s){}  //Query use the WordQuery constructor
    set<lineno> eval(const TextQuery&t) const
    {return t.run_query(QueryWord);}
    ostream& display(ostream& os) const
    {return os<<QueryWord;}
    string QueryWord;
};

我在表达式Query q=Query(s1) & Query(s2) | Query(s3);

中调用它
ERRORS:"TextQueryADVANCE.cpp:(.text+0x15ba): undefined reference to `Query::Query(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
"

2 个答案:

答案 0 :(得分:2)

这是链接器错误。您似乎没有为Query(const string&)提供实施。

答案 1 :(得分:2)

看来你把构造函数放在原型中,但实际上并没有实现。

你放了Query(const string&);,它说某个地方有一个构造函数,它接受一个字符串并用它创建一个Query。但是,在某些地方,你实际上必须放置一些能够做到这一点。