如何在 C++ 中取消引用指针对象?

Posted

技术标签:

【中文标题】如何在 C++ 中取消引用指针对象?【英文标题】:How to dereference pointer object in C++? 【发布时间】:2020-11-05 11:23:52 【问题描述】:

运行时出现错误? cout << *head << endl; 为什么我们不能取消引用对象指针? 就像我们在 int 数据类型中所做的那样:

int obj = 10;
int *ptr = &obj;
cout << *ptr << endl; //This will print the value 10 by dereferencing the operator!

但为什么不在对象中?

#include <iostream>
using namespace std;


class Node

    public:
    int data;
    Node *next;
    Node(int data)
    
        this->data = data;
        this->next = NULL;
    
;

int main() 
    Node N1(10);
    Node *head = &N1;
   
    cout << &N1 << endl;
    cout << head << endl;
    cout << *head << endl;
    cout << &head << endl;

【问题讨论】:

*headN1 对象,你没有任何方法可以输出Node 对象(operator&lt;&lt; 没有重载的函数Node)。 是否有任何输出语句按预期工作?如果不是,那么您的假设可能与您的问题主题有关是错误的。请注意,在 C++ 中,没有像其他语言那样的对象的默认输出操作。作为这里的新用户,也请带上tour并阅读How to Ask。 【参考方案1】:

您取消引用指针的事实是一个红鲱鱼:std::cout &lt;&lt; N1 &lt;&lt; endl; 不会因为同样的原因编译。

您需要为您的Node 类(在全局范围内)实现std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const Node&amp; node),在函数体中您可以按照以下方式编写一些内容


    os << node.data; // print the data
    return os; // to enable you to 'chain' multiple `<<` in a single cout statement

【讨论】:

【参考方案2】:

你得到的错误不是你不能取消引用对象指针,而是你没有指定如何打印它。指向标准库未知类型的指针可以以相同的方式打印,无论它们指向什么,但是对于实际对象和对象引用,您必须指定要在屏幕上显示的内容。您可以通过为您的类重载 &lt;&lt; 运算符来做到这一点,例如:

#include <ostream>
std::ostream& operator<<(std::ostream &os, const Node &node) 
    return os << "Node(" <<node.data << ")";

【讨论】:

别忘了return “无论指向什么,指针都以相同的方式打印”不正确(不幸的是,这太容易了;) @idclev463035818 是否没有任何指针的模板化重载? @idclev463035818 你是对的,我改写了它以减少错误

以上是关于如何在 C++ 中取消引用指针对象?的主要内容,如果未能解决你的问题,请参考以下文章

(C++) 在同一个类中调用时,取消引用的指针返回正确的值,从 main 调用时返回 0

C++:取消引用指针

在 C++ 中,如何获取指向向量的指针?

不评估应用了 sizeof 的表达式是不是使得在 C++ 中取消引用 sizeof 内的空指针或无效指针是合法的?

C++ 指针取消引用赋值

如何从 C++ 中的“指向对象的指针”向量访问对象