C ++:无法访问节点值

时间:2017-08-02 03:33:48

标签: c++

我正在尝试使用解除引用运算符打印新创建的节点。

我的主要功能

int main ()
{
    Insert(3);
    return 0;
}

插入()功能

void Insert(int data)
{
    Node *temp = new Node ;
    temp -> data = data ;
    temp -> next = NULL ;

    cout << *temp ;

}

我的错误:

tp.cpp: In function ‘void Insert(int)’:
tp.cpp:27:10: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘Node’)
     cout << *temp ;

2 个答案:

答案 0 :(得分:1)

问题: C ++仅为其基本类型提供运算符,对于用户定义的类型,我们必须编写自己的运算符。错误no match for ‘operator<<’表示编译器无法针对语句<<

找到cout << *temp ;运算符

可能的解决方案:

  1. 与@ user4581301相同,您可以为<< Node cout << *temp ; write your own operator个。{/ p>

  2. 您还可以将cout << temp->data ;语句替换为cout << (*temp).data ;->,因为temp是指向结构的指针。您可以在data之前使用.或使用*访问/node_modules/passport-oauth1/lib/strategy.js:396:17),但可以在使用console.log运算符取消引用之后使用xmkmf -a

答案 1 :(得分:0)

任何操作员基本上都是一个功能。 例如,为类Rational添加运算符+的加法运算符可能表示为成员函数:

class Rational
{
  private:
    ...
    ...
  public:
    ...
    //Implicit arg "this" is Left Hand operand.
    //Explicitly stated arg objRational is Right Hand operand.
    Rational operator+(const Rational& objRational) const {...};
    ...
};
  

请注意,这里的参数是const,以确保我们不会意外地修改操作数本身,并且函数标记自己const以确保我们不修改{{1}对象。 Arg是由ref传递的,因为如果我们没有肯定地修改它,就不需要复制并且没有损坏ref。

以上在技术上是一个功能,所以你可以做类似

的事情
this

然后只是添加到C ++语法的语法糖,允许与

进行相同的调用

Rational r1(3, 4), r2(22, 7); Rational r3 = r1.operator+(r2); //Really possible! Try it!

你写了

Rational r3 = r1 + r2;

其中,cout << *temp ;的类型是Node,(*temp)cout类的对象。

因此,编译器现在正在寻找一个带左手操作数的重载运算符ostream对象,右手操作数寻找一个ostream对象。

所以,它就像在类ostream本身的某个地方写作一样好,

Node

但是,我们没有这种可能性,因为我们首先没有编写类ostream。当它被写入时,你的节点不存在!此外,它可能需要访问objNode的私有成员,这些成员不允许使用不属于Node类的成员。

如果我们尝试将其作为Node类的成员,它可以访问Node的私有成员。但是现在class ostream : ... { ... ... //Here, the only one explicit arg is Node, //which is Right Hand side operand. //Since it is a member operator, //implicit arg "this" will be, by default, the LH operand. public ostream& oprtator<<(const Node& objNode){...} ... } 的左手操作数需要是Node,这会破坏整个目的。

所以,我们所做的就是让它成为朋友的功能。

operator<<

这会创建一个class Node { ... ... public: ... //Since this is NOT a member, bot LH and RH operand need to be stated explicitelty friend ostream& operator<< (ostream& out, const Node& objNode) { out << node.data; return out; } ... }; ,它将操作数保留为operator<<,右操作数为ostream,并且可以访问Node的私有成员,因为它是朋友。 (^ _ ^)

为什么接受ostream对象的并返回引用?

因为,当您尝试链接调用时,需要连续写入相同的对象。

考虑一个陈述:node

它将被评估为

cout << "First: " << objNode1 << ", Second: " << objNode2;

从内到外,对于每次调用,我们需要将( ( ( cout << "First: " //Innermost call ) << objNode1 ) << ", Second: " )<< objNode2; 个对象传递给具有所有先前插入的重载运算符,因此内部调用需要将引用返回到已修改(插入后) <{1}}的对象将被退回。

希望它有所帮助;快乐编码:)