在 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 structptype2(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是你的参数名称。然后它变得困惑,也让用户感到困惑(通过使用非直观的错误排序)。