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&)超载。