2010-11-07 51 views
-2
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; 
}; 

的書的練習15.41我調用它在表達Query q=Query(s1) & Query(s2) | Query(s3);在C++底漆4

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

當提出問題時,請1)記住將實際的**問題**,不只是源代碼和錯誤消息的列表,2)**格式化您的代碼**,以便我們可以閱讀它。選擇文本並不困難,並點擊'101010'按鈕,它爲我們帶來了「隨機垃圾」和「可讀源代碼」之間的區別。它給人的印象是你*關心*回答你的問題。如果你甚至不能制定一個可讀的問題,爲什麼其他人應該被困擾回答它? – jalf 2010-11-07 14:13:33

+0

當您編寫問題時,在編輯框下方有一個非常方便的預覽窗口。你可以立即看到你的格式是否好。 – 2010-11-07 14:15:01

+0

請給出一個問題的描述,因爲不是每個人都有這本書。請格式化您的代碼,使其可讀 – segfault 2010-11-07 14:17:38

回答

2

看起來,你把構造函數的原型,但你沒有實際上把一個實現。

你把:Query(const string&);,它表示有一個構造函數的地方需要一個字符串,並創建一個查詢。然而,在某個地方你實際上必須要做一些這樣的事情。

2

這是一個連接錯誤。看來你還沒有提供Query(const string&)的實現。

+0

如果你讀過這本書,你可以認爲這不是原因 – liu 2010-11-07 14:24:19

+0

@liu:如果你知道什麼不是原因,那麼寫在你的問題。不要指望我們準備好一些書並查找,只是爲了回答你的問題。 – 2010-11-07 14:26:12

+2

@liu如果你讀過這本書,你會知道問題是什麼。 – Woot4Moo 2010-11-07 14:38:16