c ++重载构造函数与新类型/类和朋友

cod*_*imp 1 c++ constructor overloading friend

无论如何使用friend使用新定义的结构重载已经声明的struct的构造函数.例如,在下面的简单示例中,我想struct A使用一个使用struct B,但不修改Ah来重载构造函数.

main.cpp中

#include "A.h"
#include "B.h"

int main() {
    B x(2);
    A y(B); 
};
Run Code Online (Sandbox Code Playgroud)

struct A {
    float a;
    A(float);
};

A::A(float f)   { a=f; };
Run Code Online (Sandbox Code Playgroud)

BH

struct B {
    float b;
    B(float);
    B(A);
};

B::B(float f)   { b=f;   };
B::B(A s)       { b=s.a; };

A::A(B s){ a=s.b; };
// ^^^----obviously error since A(B) is not declared, 
// but how can I make this work without changing A.h?
Run Code Online (Sandbox Code Playgroud)

我知道我可以用适当的安置解决的问题struct B;,并A(B);在中.我还想出了一种使用模板的方法,但它并不是一个优雅的解决方案.它需要修改.由于我不想进入这里的原因,我不想采用这些技术中的任何一种.我想重载A :: A()构造函数而不修改Ah,更重要的是,不假设放置#include "A.h"是可控的.我认为这是朋友的用途,但我不知道是否/如何使它与构造函数一起工作.

Die*_*ühl 5

您不能将构造函数(或其他成员)添加到类中.但是,您可以在涉及的其他类中创建转换运算符:

class B {
   // ...
public:
    explicit operator A() const { /* build an A object and return it */ }
};
Run Code Online (Sandbox Code Playgroud)