2015-06-08 69 views
2

我有此類:爲什麼我不能在這裏通過引用傳遞類對象?

class Token { 
    std::string name; // token name 
    int frequency;//frequency 
    Vector lines;//lines where the token is present 

public: 
    //explanations for the methods in the Token.cpp 
    Token(std::string tokenname, int linenumber); 
    virtual ~Token(); 
    void newEntry(int &linenumber); 
    std::string getName(); 
    int getFrequency(); 
    std::string toString(); 
}; 

並且存在另一類

class Node { 
    Token data; 
    Node* next; 
public: 
    Node(const Token &v); 

}; 

在我想傳遞一個恆定參考令牌對象節點的構造。但是,當我寫的方法cpp文件:

Node::Node(const Token &v){ 
    data = v; 
} 

我得到一個編譯錯誤:

../src/List.cpp: In constructor ‘Node::Node(const Token&)’: ../src/List.cpp:11:26: error: no matching function for call to ‘Token::Token()’ Node::Node(const Token &v){ ^../src/List.cpp:11:26: note: candidates are: In file included from ../src/List.h:10:0, from ../src/List.cpp:8: ../src/Token.h:19:2: note: Token::Token(std::string, int) Token(std::string tokenname, int linenumber); ^../src/Token.h:19:2: note: candidate expects 2 arguments, 0 provided ../src/Token.h:12:7: note: Token::Token(const Token&) class Token { ^../src/Token.h:12:7: note: candidate expects 1 argument, 0 provided make: *** [src/List.o] Error 1

我怎樣才能解決這個和是什麼原因導致這個問題?我真的想通過令牌參考/

+0

再次讀取錯誤消息,它說是'Token'沒有默認構造函數。然後搜索並閱讀*構造函數初始化列表*。 –

+0

您的節點應該包含提供的令牌的副本還是隻指向已經存在的令牌? – buygrush

+0

這真的是重複的嗎?我不認爲這個鏈接的問題是最佳方式回答OP問題。 – rozina

回答

3

您需要更改執行這樣的:

Node::Node(const Token &v) : data(v){ 
} 

調用正確的構造函數,否則編譯器會先調用默認的構造函數(其中缺少,因此,消息),則賦值運算符。

+0

這個問題解決了,謝謝:) – Ophelia

2

根據你的代碼,Token需要有一個默認的構造函數,但它沒有。 dataNode類將通過它的默認構造函數首先進行初始化,然後通過在operator=Node::Node的構造函數指定。您可以使用ctor初始化列表來解決它,將調用Token的副本。

Node::Node(const Token &v) : data(v) {} 
+0

謝謝:)我不知道有關 – Ophelia

相關問題