添加转换构造函数而不触及类

时间:2013-03-28 09:33:55

标签: c++ copy-constructor

我有两个类,来自两个不同的库,具有相同的含义:

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类定义的情况下添加转换构造函数(或实现相同的结果)?

3 个答案:

答案 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&)重载。