为什么我不能通过引用传递类对象?

时间:2015-06-08 06:30:05

标签: c++

我有这堂课:

 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:在构造函数'Node :: Node(const Token&)':.. / src / List.cpp:11:26:错误:没有用于调用'Token的匹配函数: :Token()'Node :: Node(const Token& v){                             ^ ../src/List.cpp:11:26:注意:候选者是:在../src/List.h:10:0中包含的文件中,                    from ../src/List.cpp:8:../src/Token.h:19:2:注意:Token :: Token(std :: string,int)Token(std :: string tokenname,int linenumber) ; ^ ../src/Token.h:19:2:注意:候选人需要2个参数,0提供../src/Token.h:12:7:注意:Token :: Token(const Token&)类令牌{          ^ ../src/Token.h:12:7:注意:候选人需要1个参数,0提供make:*** [src / List.o]错误1

如何解决此问题以及导致此问题的原因?我真的想传递令牌参考/

2 个答案:

答案 0 :(得分:3)

你需要改变这样的实现:

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

调用正确的构造函数,否则编译器将首先调用默认构造函数(缺少,因此消息),然后调用赋值运算符。

答案 1 :(得分:2)

根据您的代码,Token需要有默认的ctor,但它没有。课程data中的Node将首先由其默认ctor初始化,然后由operator=Node::Node的ctor中分配。您可以使用ctor初始化列表来解决它,而是调用Token的副本。

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