我有两个类,它们代表两种可以来回转换的不同数据类型。我希望每个都有一个构造函数,它接受另一个类型的对象,这样我就可以更容易地在两者之间进行转换,如下所示:
class A{
public:
A(B n){
//Do stuff converting n to type A
}
};
class B{
public:
B(A n){
//Do stuff converting n to type B
}
};
但总是无法编译。
答案 0 :(得分:3)
如果您通过引用传递extractFile
,则可以在B
中将其用作不完整类型,并带有前向声明,例如:
A
请注意,您还需要至少class B; // forward declaration
class A {
public:
A() = default;
A(B& n); // declare it here
};
class B {
public:
B() = default;
B(A n) {
//Do stuff converting n to type B
}
};
A::A(B& n) // define it here, B is fully visible now
{
//Do stuff converting n to type A
}
int main()
{
A a;
B b(a);
A another(b);
}
或A
的默认构造函数,否则您无法创建B
而没有A
或其他方式。我们也只在B
中声明了构造函数,但在A
完全可见后定义了它(感谢@MattMcNabb的注释)。这样,您就可以在构造函数中使用B
的任何成员,因为此时B
完全可见。
答案 1 :(得分:1)
你遇到的问题对于C ++的初学者来说很常见(或者C就此而言)。
问题是,在看到A(B n)
的声明之前,编译器会看到签名B
。但显然,您无法在B
之前将A
放在代码中,或者您最终会遇到相同类型的情况。
这可以使用前向声明和引用来解决。我建议的默认方法是将这两个实体声明为
class B;
class A {
public:
A(const B& n) {
// Do stuff converting n to type A
}
};
class B {
public:
B(const A& n) {
// Do stuff converting n to type B
}
};