2

我已經重新定義了< <運算符,我希望它能夠引用指針。指針和左移運算符的引用

class foo 
{ 
    foo(); 
    virtual ~foo(); 

    void operator << (BaseService*& iRight); 
} 

某處在代碼中,有一個Foo實例,這是BaseService類的專業化服務我做的:

Service* service_pointer = new Service(); 
foo_instance << service_pointer; 

但我得到這個錯誤: 錯誤:難擋'運營商< <' 在 'foo_instance < < service_pointer' 注:考生是:無效美孚::運算< <(BaseService * &)

沒有什麼變化,如果我的dynamic_cast我service_pointer到BaseService

Service* service_pointer = new Service(); 
foo_instance << dynamic_cast<BaseService*>(service_pointer); 

任何想法?

回答

3

第一個版本不工作,因爲你不能在引用傳遞的指針亞型這是正確的:如果有什麼的operator<<方面取得的指針指向一個實例MyService(這是BaseService一個子類,但不是Service)?顯然,Service*指向MyService將是非法的。因此不允許傳入Service*

第二個版本是不允許的,因爲dynamic_cast沒有返回一個l值,所以你不能將它作爲非const引用傳遞。

,你唯一可以做的就是定義BaseService*類型的另一個變量,並傳遞作爲參數傳遞給<<。如果<<然後重新分配指針,則該更改僅對新創建的變量可見,並且不會影響ServicePointer

這是說(不知道你的用例)我不得不建議你有operator<<非正常的參考任何東西,因爲它的右操作數罷工我是不好的做法。您通常不會期望<<修改它的右操作數。

0

您必須實際定義一個BaseService指針變量。

Service* service_pointer = new Service(); 
BaseService* base_service_pointer = dynamic_cast<BaseService*>(service_pointer); 
foo_instance << base_service_pointer; 

至於你想利用指針引用,它不可能是一個右值。

另請注意,dynamic_cast<>這裏沒有必要。 A static_cast<>會訣竅。更好的是,使用從service_pointerbase_service_pointer的簡單作業!

0

這不可能工作,因爲引用是非常量,因此您可以更改foo :: operator < <中的指針值。請看下面的例子:

 

class Service1 : BaseService 
{ 
}; 

class Service2 : BaseService 
{ 
}; 

void foo::operator << (BaseService*& iRight) 
{ 
    // ok, iRight is a reference to BaseService* 
    // so we can assign Service2* to it, can't we? 
    iRight = new Service2(); 
} 

Service1* service_pointer = new Service1(); 
foo_instance << service_pointer; // oops... 
 
1

只是因爲Service *類型轉換爲BaseService *類型不以任何方式意味着Service *&類型轉換爲BaseService *&類型。事實並非如此。這就是爲什麼你的第一個調用不能編譯。

嘗試使用dynamic_cast(或任何其他非黑客投)將不會幫助。這種演員的結果不是左翼。而且你不能將非const引用綁定到不是左值的東西。這就是爲什麼你的第二個調用不能編譯。

如果你真的想你的運營商接受專門BaseService *&,那麼你是有限的左值BaseService *型執行Service *手動預轉化爲(即一個明確的指針對象),然後調用與運營商如果你改變了聲明,左值

Service* service_pointer = new Service(); 
BaseService* base_service_pointer = service_pointer; 
foo_instance << base_service_pointer; 

您對運營商<<通話將編譯,如果操作者

void operator <<(BaseService* const& iRight); 

,不過你是否能做到這一點,取決於你的意圖。你爲什麼試圖通過引用傳遞一個指針?

+0

我想通過引用傳遞一個指針,因爲我的Foo類包含服務的列表,以及潛在的服務添加了<<操作員將被合併(如果可能)與現有的service.In這種情況下, service_pointer將被刪除,我想,以避免任何問題,如果主叫方將其重新分配給該服務被新的服務已經被合併再次使用它。 – codeJack