2013-05-27 33 views
-1

我有以下類實現: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工作。我的問題是什麼?

+0

你能解決你的A類和C類的定義嗎? – jrd1

+1

您是否收到錯誤? – 0x499602D2

+0

類A有一些純虛函數..和類C沒有任何東西(只是爲了「複製」一個類B)爲了做我的主要第二行。 –

回答

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這個課程做什麼,我認爲你的程序中甚至沒有任何理由。