ostream operator<<用于地址和指针

时间:2013-05-27 00:26:55

标签: c++ operator-overloading ostream

我实现了以下类:

class NUMS {
   int* numbers;
   int size;
  public:
   ostream& operator << (ostream& out, NUMS const& nums) {
       for (int i = 0; i < size; ++i) out << nums.numbers[i] << " \n";
       return out;
   } 
};

class A

class B : public A {
   NUMS* numbers;
   public:
     C& func() {
         C* c = new C();
         return *c;
     }
     ostream& operator << (ostream& out, B const& b) {
        for (int i = 0; i < b.numbers->get_size(); ++i) out << b.numbers[i];
        return out;
     }
};

class C : public B

在我的main

A* a = new B();
B& b = a->func();
cout << a;
cout << b;

ostream运算符在cout << b不起作用。我的问题是什么?

1 个答案:

答案 0 :(得分:1)

首先,您的operator <<重载应该是全局运算符,它也应该是类的friend,因此它可以访问类的私有数据成员:

friend ostream& operator << (ostream& out, NUMS const& nums)
{
    // ...
}

同样适用于<<中的B重载。

你很可能在func中得到未定义的行为,但我认为你应该做的是删除代码中的所有指针实例和new,因为它们不需要。 new不用于创建类的实例,它实际上是分配动态内存。

您的func方法可能会返回堆栈分配的A实例:

C func()
{
   return C();
}

它还应该通过- value 返回它,因为通过引用返回会在结束括号后立即引起悬空引用,因为临时对象已经被销毁了。

我认为你对以下几行正在做的事感到困惑:

cout << a;
cout << b;

第一个打印出指针的值(即地址)。在这种情况下,它不会调用任何运算符重载。由于前面的行不正确,编译器甚至不会打印b

如果您希望cout << b正常工作,则必须更改初始化方式。由此:

B& b = a->func();

简单地

B b;

从那里打印b应该有效。我不确定你要对a->func()C课程做些什么,我认为你的课程中没有任何理由。