2012-09-10 24 views
3
class B; 

class A{ 

    B *b; 
    public: 
    void operator= (B *b){ 
     this->b = b; 
    } 
}; 

B *b = new B() 
A *a = new A(); 
a = b; 

我得到一個 「不能轉換B*A*」 的錯誤。 有沒有辦法解決這個問題?C++重載賦值運算符: 「不能轉換`B *``到A *`」 錯誤

現在,如果有一種方法,如果我使用類似:

a = NULL; 

哪個運營商「=」將被使用?

+2

您的重載指定給'A',而不是'A *'。 – chris

+1

您正在爲指向「A」的指針分配一個指向「B」的指針,這與將「B」指派給「A」不同。 – juanchopanza

+0

謝謝大家。菜鳥錯誤! – nahpr

回答

4

operator=提供了一個AB*分配。您的代碼不提供從B*A*的轉換(如錯誤消息所示)。因此,a=NULL將不會使用您提供的賦值運算符,因爲a是指針,而不是A。您的代碼允許從B*轉換爲A,如A a= new B();

如果你打算使用實際的對象,而不是指針,從你的代碼中刪除所有*

class B{};  
class A{  
    B b; 
    public: 
    void operator= (const B& b){ //pass non-primitives by const reference 
     this->b = b; 
    } 
}; 

B b; 
A a; 
a = b; 

如果你想使用指針,只有「有用」的方式來分配B*到如果B對象來自A,則爲A*。這似乎不是你在做什麼,所以將B*分配給A*在你的代碼中是沒有意義的。

+0

爲了說明清楚,'void operator =(B * b)'將僅用於** B b; A =&b;' – NtscCobalt

8

您已經指定了指針而不是對象。只需更換與最後一個指令: *a = b;

要回答的第二個問題:NULL可以在編譯器不止一種方式來定義(如最新的標準,無論是作爲整體0或文字nullptr)。指針也可以轉換爲其他類型的指針,但是將void*傳遞給一個採用int*long*的重載函數可能會使編譯器無法解析正在調用的函數。

但是,如果您想避免NULL,只需改爲operator(B& b)即可。參考文獻肯定是指向一個對象。

+1

在C++中,NULL被定義爲0.這是唯一合法的定義。 –

+0

我確定在MSVC2008中觀察到NULL被定義爲'((void *)0)'。 –

+0

在C++中,NULL必須是空指針常量(通常是值爲0的整數常量表達式)。與C'((void *)0)不同,它不能被轉換,比如沒有轉換就轉換成int *。 –

2

更改語句分配給到:

*a = b;