我有两个类,来自两个不同的库,具有相同的含义:
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类定义的情况下添加转换构造函数(或实现相同的结果)?
答案 0 :(得分: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;
};
答案 1 :(得分:3)
只需使用工厂:
struct AfromB
{
static A convert(const B&);
}
和
setB(AfromB::convert(a));
答案 2 :(得分:1)
如果您无法访问B
类定义,可能更简单的是void setB(const A&)
重载。