2013-03-28 25 views
2

我有兩個班,從兩個不同的庫,具有相同的含義:新增轉換構造而不觸及類

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

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

我想調用函數與B作爲參數傳遞一個A對象:

void setB(const B&) { 

} 

int main(int argc, char* argv[]) { 
    A a; 
    setB(a); 
} 

我知道這是可能的,從添加轉換構造器:

class B { 
public: 
    B() {} 
    B(const B&) {} 
    B(const A&) {} // CANNOT ADD THIS! 
}; 

但是這些類是在兩個外部庫中定義的,我沒有權利修改它們。

如何在不觸及B類定義的情況下添加轉換構造函數(或實現相同的結果)?

+1

你叫如上拷貝構造函數是什麼(*您提出了一個可能的解決方案*)在這種情況下,實際上是一個轉換構造函數而不是複製構造函數。 – 2013-03-28 09:35:58

+0

編寫一個將'A'作爲輸入並返回'B'的函數? – juanchopanza 2013-03-28 09:36:42

+0

你有控制功能嗎?如果是這樣,如果到'A'和'B'的接口是相同的,你可以使它們成爲'template'函數。 – hmjd 2013-03-28 09:37:51

回答

5

如何在不觸及B類定義的情況下添加轉換構造函數(或實現相同的結果)?

如果B類有虛析構函數,你可以專注B和專業化添加額外的功能。如果它沒有虛擬析構函數,則可以將B嵌入到包裝類中。

這意味着之一:

class SpecialB: public B { // if B has virtual destructor 
public: 
    SpecialB(const A&); // you _can_ do this 
}; 

或:

class SpecialB { 
public: 
    SpecialB(const A&); // you _can_ do this 
private: 
    B wrapped_b; 
}; 
+0

這與我正在尋找的東西非常接近。這是一個優雅的解決方案。謝謝。 – 2013-03-28 09:57:21

3

只需使用一個工廠:

struct AfromB 
{ 
    static A convert(const B&); 
} 

和:

setB(AfromB::convert(a)); 
1

如果你有B類定義用不上,也許是簡單的是有一個void setB(const A&)超載。