c ++用新的type/class和朋友重载构造函数
c++ overloading constructor with new type/class and friend
是否可以使用 friend
将已声明的结构的构造函数重载为使用新定义的结构的构造函数。例如,在下面的简单示例中,我想使用 struct B
、BUT 重载 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;
}
它基本上定义了一个转换运算符。
是否可以使用 friend
将已声明的结构的构造函数重载为使用新定义的结构的构造函数。例如,在下面的简单示例中,我想使用 struct B
、BUT 重载 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;
}
它基本上定义了一个转换运算符。