【问题标题】:Why I can't pass class object by reference here? [duplicate]为什么我不能在这里通过引用传递类对象? [复制]
【发布时间】:2015-08-22 12:39:48
【问题描述】:

我有这门课:

 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 包含的文件中, 来自 ../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&) class Token { ^ ../src/Token.h:12:7: 注意:候选人需要 1 个参数,0 提供 make: *** [src/List.o] 错误 1

我该如何解决这个问题?是什么导致了这个问题?好想传Token参考/

【问题讨论】:

  • 再次阅读错误信息,它说Token 没有默认构造函数。然后搜索并阅读构造函数初始化列表
  • 您的节点应该包含所提供令牌的副本还是只指向一个已经存在的令牌?
  • 这真的是复制品吗?我认为链接的问题不是回答 OP 问题的最佳方式。
  • 这是比较基础的C++。您应该阅读语言基础知识。

标签: c++


【解决方案1】:

您需要像这样更改实现:

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

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

【讨论】:

  • 这解决了问题,谢谢:)
【解决方案2】:

根据您的代码,Token 需要有一个默认 ctor,但它没有。 dataNode 中的data 将首先由其默认ctor 初始化,然后由operator=Node::Node 的ctor 中分​​配。可以使用ctor初始化列表来解决,Token的copy ctor会被调用。

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

【讨论】:

  • 谢谢:) 我不知道
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 2015-06-18
  • 2017-02-02
  • 2012-07-18
  • 2016-12-09
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
相关资源
最近更新 更多