c ++用新的type/class和朋友重载构造函数

c++ overloading constructor with new type/class and friend

是否可以使用 friend 将已声明的结构的构造函数重载为使用新定义的结构的构造函数。例如,在下面的简单示例中,我想使用 struct BBUT 重载 struct A 构造函数而不修改 A.h.

main.cpp

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

int main() {
    B x(2);
    A y(B); 
};

A.h

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

A::A(float f)   { a=f; };

B.h

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?

我知道我可以通过在 A.h 中适当放置 struct B;A(B); 来解决问题。我也想出了一种使用模板的方法,但这不是一个优雅的解决方案。并且需要修改A.h。由于我不想进入这里的原因,我不想使用这两种技术中的任何一种。我想在不修改 A.h 的情况下重载 A::A() 构造函数,更重要的是,不假设 #include "A.h" 的位置是可控的。我认为这就是 friend 的用途,但我不知道 if/how 让它与构造函数一起工作。

你不能重载不存在的东西。您也不能定义不存在的成员函数。但是您可以编写一个简单的函数来为您完成这项工作:

A fromB(const B& s) { return A(s.b); }

如果允许修改B,可以给它一个转换运算符:

struct B {
    explicit operator A() const { return A(b); }

    // as before
};

您不能向 class 添加构造函数(或其他成员)。但是,您可以在涉及的其他class中创建一个转换运算符:

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

如果您可以控制 B 并想定义一种方法如何从 B 生成 A,您可以定义一个所谓的转换运算符:

#include <iostream>
using namespace std;

struct A
{
    A(float val) : _val(val) {};
    float _val;
};

struct B{
    operator A(){ // how to make A from B.
        return A(2);
    }
};

int main() {
    B b;
    A a = b;
    cout << a._val << '\n';
    return 0;
}

它基本上定义了一个转换运算符。