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

4

3 回答 3

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;
};
于 2013-03-28T09:37:48.060 回答
3

只需使用工厂:

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

和:

 setB(AfromB::convert(a));
于 2013-03-28T09:35:26.853 回答
1

如果您无权访问B类定义,也许更简单的是void setB(const A&)重载。

于 2013-03-28T09:37:06.233 回答