在 C++ 中复制具有不同结构的构造函数
Copy constructor with different struct in c++
如何初始化 ptype2
以复制 ptype3
结构(类型转换)?
typedef struct PType2 {
double x, y;
PType2() : x(0), y(0) {}
PType2(const PType3 & ptype3) : x(ptype3.x), y(ptype3.y) {} //Abort ptype3.z to create a two-dimensional point
PType2(double xy) : x(xy), y(xy) {}
PType2(double x, double y) : x(x), y(y) {}
} ptype2;
输出:
error C2065: 'ptype3' : undeclared identifier
error C2143: syntax error : missing ',' before '&'
error C2228: left of '.a' must have class/struct/union
error C2228: left of '.b' must have class/struct/union
error C2664: 'PType2::PType2(const PType2 &)' : cannot convert argument 1 from 'ptype3' to 'const int'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
我有两个 typedef struct
、ptype2(double x, double y)
和 ptype3(double x, double y, double z)
。
赋值运算符重载可以解决问题吗?
编译器找不到 PType3。前向声明在这里是不够的,因为您想访问 PType2 中 PType3 的成员。
但是,您可以在定义 PType3 之后实现构造函数,然后前向声明就可以了。
struct PType3;
struct PType2 {
double x, y;
PType2() : x(0), y(0) {}
PType2(const PType3 & ptype3);
PType2(double xy) : x(xy), y(xy) {}
PType2(double x, double y) : x(x), y(y) {}
};
struct PType3 {
double x, y;
PType3() : x(0), y(0) {}
PType3(const PType2 & ptype2) : x(ptype2.x), y(ptype2.y) {}
PType3(double xy) : x(xy), y(xy) {}
PType3(double x, double y) : x(x), y(y) {}
};
并且在 cpp 中:
PType2::PType2(const PType3 & ptype3) : x(ptype3.x), y.(ptype3.y) {};
复制构造函数的签名是:
T( const&T t );
而您的代码中没有它。
如果你想用PType3
构造PType2
你必须在PType2
.
之前定义PType3
首先PType2(const PType3 & ptype3)
不是正式的拷贝构造函数。从 C++ 的角度来看,它是 PType2(const PType2 &)
.
我认为您缺少的是包含定义 class PType3 的头文件。
话虽如此,您提供的错误与代码不完全匹配。您在粘贴到 Whosebug 之前是否修改了代码?
通常我会建议阅读错误消息,但在这种情况下它们有点令人困惑。我想问题是你没有在 PType2
之前定义 PType3
,它实际上必须在你尝试访问它的成员时被完全定义(所以一个简单的前向声明不会做)。
错误消息似乎是由支持默认为 int
的编译器引起的。第一个错误是在这种情况下,因为编译器看到 PType3
并且由于它尚未声明它不是类型所以编译器假定它应该默认为 int
所以它认为 PType3
是你的参数名称。然后它变得困惑,也让用户感到困惑(通过使用非直观的错误排序)。
如何初始化 ptype2
以复制 ptype3
结构(类型转换)?
typedef struct PType2 {
double x, y;
PType2() : x(0), y(0) {}
PType2(const PType3 & ptype3) : x(ptype3.x), y(ptype3.y) {} //Abort ptype3.z to create a two-dimensional point
PType2(double xy) : x(xy), y(xy) {}
PType2(double x, double y) : x(x), y(y) {}
} ptype2;
输出:
error C2065: 'ptype3' : undeclared identifier
error C2143: syntax error : missing ',' before '&'
error C2228: left of '.a' must have class/struct/union
error C2228: left of '.b' must have class/struct/union
error C2664: 'PType2::PType2(const PType2 &)' : cannot convert argument 1 from 'ptype3' to 'const int'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
我有两个 typedef struct
、ptype2(double x, double y)
和 ptype3(double x, double y, double z)
。
赋值运算符重载可以解决问题吗?
编译器找不到 PType3。前向声明在这里是不够的,因为您想访问 PType2 中 PType3 的成员。
但是,您可以在定义 PType3 之后实现构造函数,然后前向声明就可以了。
struct PType3;
struct PType2 {
double x, y;
PType2() : x(0), y(0) {}
PType2(const PType3 & ptype3);
PType2(double xy) : x(xy), y(xy) {}
PType2(double x, double y) : x(x), y(y) {}
};
struct PType3 {
double x, y;
PType3() : x(0), y(0) {}
PType3(const PType2 & ptype2) : x(ptype2.x), y(ptype2.y) {}
PType3(double xy) : x(xy), y(xy) {}
PType3(double x, double y) : x(x), y(y) {}
};
并且在 cpp 中:
PType2::PType2(const PType3 & ptype3) : x(ptype3.x), y.(ptype3.y) {};
复制构造函数的签名是:
T( const&T t );
而您的代码中没有它。
如果你想用PType3
构造PType2
你必须在PType2
.
PType3
首先PType2(const PType3 & ptype3)
不是正式的拷贝构造函数。从 C++ 的角度来看,它是 PType2(const PType2 &)
.
我认为您缺少的是包含定义 class PType3 的头文件。
话虽如此,您提供的错误与代码不完全匹配。您在粘贴到 Whosebug 之前是否修改了代码?
通常我会建议阅读错误消息,但在这种情况下它们有点令人困惑。我想问题是你没有在 PType2
之前定义 PType3
,它实际上必须在你尝试访问它的成员时被完全定义(所以一个简单的前向声明不会做)。
错误消息似乎是由支持默认为 int
的编译器引起的。第一个错误是在这种情况下,因为编译器看到 PType3
并且由于它尚未声明它不是类型所以编译器假定它应该默认为 int
所以它认为 PType3
是你的参数名称。然后它变得困惑,也让用户感到困惑(通过使用非直观的错误排序)。