2010-09-24 177 views
2
class A{ 
}; 

class B{ 
public: 
    B(); 
    B(const &A); 
}; 

void foo(A &a){ 

} 

int main(){ 
    B b; 
    foo(b); //error: invalid initialization of reference of type ‘A&’ from expression of type ‘B’ 
    return 0; 
} 

在上面的代碼中,我有一個編譯錯誤爲函數類型轉換參數

錯誤:從類型「B」

的表達類型的參考「A &」無效初始化錯誤可以通過foo()的函數重載來解決。但是,您是否有其他建議可以解決問題?

函數foo(A & a)不使用參數「a」作爲輸入。參數「a」僅僅是函數foo的輸出(A & a)。

謝謝。

+1

「錯誤」是你的代碼沒有意義。目前還不清楚你想要代碼做什麼,然後很難告訴你應該如何修復它。你也可以將函數調用註釋掉,這會「解決」它。 – jalf 2010-09-24 08:16:08

回答

3

有許多選項...很難知道推薦什麼而不理解你的程序正在嘗試什麼。我們給出的分爲A和B之間的邏輯關係的很少見地是:

  • 只有B的構造函數中的一個需要非const引用到一個對象
  • FOO()的目的是與合作無論是A或B

這意味着一個指針指向一個可被保存在B,但迴避了一個問題:應該foo的()與所有B的(也許使用一個默認構造的,如果沒有在建設提供)工作或者只有那些參照A構建的那些?

設計選項包括:

  • 獲得B,從A(但你的默認構造函數表明一個B可沒有處於被 「捆綁」 到A存在)
  • 添加A& get_A()和/或const A& get_A() const成員(S )至class B,然後調用foo(b.get_A());
    • operator A&()operator const A&() const做到這一點隱含
    • 你可能更A* get_A()等,如果A是可選
  • template <class A_or_B> foo(A_or_B&)如果A和B提供了富對任一
  • 過載foo的工作,對於每種類型的

探索代碼提供不同的實施方式中,右構件/語義:

#include <iostream> 

struct A 
{ 
    int n_; 
}; 

void foo(A& a) 
{ 
    a.n_++; 
} 


struct B 
{ 
    // e.g. B() : p_a_(new A), owner_(true) { } ? 
    //  ~B() { if (owner_) delete p_a_; } 
    B(A& a) : p_a_(&a) { } 

    operator A&() { return *p_a_; } 

    A* p_a_; 
}; 

int main() 
{ 
    A a; 
    a.n_ = 2; 
    B b(a); 
    foo(a); 
    foo(b); 
    std::cout << a.n_ << '\n'; 
} 
+0

請注意,只有當函數/方法將對象或常量引用作爲參數時,隱式轉換纔會起作用。 – 2010-09-24 08:12:51

+0

感謝您的解決方案。我忘了說函數foo(A&a)不使用參數「a」作爲輸入。參數「a」只是函數foo(A&a)的輸出。 – iampat 2010-09-24 08:17:37

+0

@Space_COwbOy:它不能是臨時的,但可以返回對存儲在B中的變量的引用,或者可用的指針。 @iampat:不客氣。如果foo(A&a)加載「a」,那麼這些方法中的任何一個都是有效的。上面添加了一些示例代碼。 – 2010-09-24 08:27:33

0

問題是,您試圖隱式地將對象B轉換爲對象A.考慮到這些是爲了分離類,編譯器將無法做到這一點。雖然可以明確地將對象B的指針或引用轉換爲對象A的*/&,但這會讓編譯器感到困惑,這是一個非常糟糕的主意。

這就像你要求編譯器將蘋果轉換爲橙色一樣,無法完成。如果B是A的一個子類,這將是完全可能的。但是如果兩個類沒有共同之處或者沒有共同之處,你不能簡單地將其作爲一種工作來解決。如果他們這樣做,並且你有幾個相關的類,創建一個基類(包含共享方法),並使所有這些類從它派生。

再次,請不要做類似(A*)(&b)的事情,因爲如果您不知道您實際在foo()的參數中獲得什麼類,則會導致運行時問題(同樣,除非B源自一個)。

當然,最好的方法是超載Foo()。

編輯:你看,你可以在B的構造函數中從A轉換到B.但是你需要一個A並擁有一個B,所以需要REVERSE轉換。這就是爲什麼你當前的代碼不起作用。

+0

謝謝你的回答。我忘了說函數foo(A&a)不使用參數「a」作爲輸入。參數「a」只是函數foo(A&a)的輸出 – iampat 2010-09-24 08:27:43

0

你真的想讓A和B成爲不相關的類嗎?如果A和B類份額是,一個關係那麼好,你從A

class B : public A 

然後還foo(b)以foo獲得B(A &一)作爲簽名會導致成目標切片。

0

最簡單的方法..如果您願意在對象A中分配對象B.您需要查看它們是否兼容與否。

爲了從我的角度探討編譯如下嘗試:

​​

希望這一點,實在值得。

相關問題