-1

我实现了以下类:

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. 我的问题是什么?

4

1 回答 1

1

首先,你的operator <<重载应该是一个全局操作符,它也应该是friend类的一个,这样它就可以访问类的私有数据成员:

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

中的<<重载也是如此B

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

您的func方法可以返回一个堆栈分配的实例,A而不是:

C func()
{
   return C();
}

它还应该按返回它,因为按引用返回会在结束大括号之后立即导致悬空引用,因为临时对象已经被销毁。

我认为您对以下几行的作用感到困惑:

cout << a;
cout << b;

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

如果你想cout << b工作,你必须改变你初始化它的方式。由此:

B& b = a->func();

简单地

B b;

从那里打印出来b应该可以。我不确定您要尝试做什么a->func()C课程,我认为您的程序中甚至没有任何理由。

于 2013-05-27T00:46:54.823 回答