在c ++中复制具有不同结构的构造函数

时间:2015-08-19 12:38:55

标签: c++ struct initialization type-conversion copy-constructor

如何初始化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),{{1}}和{{1}}。

赋值运算符重载可以解决问题吗?

4 个答案:

答案 0 :(得分:1)

编译器找不到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) {};

答案 1 :(得分:1)

复制构造函数的签名是:

T( const&T t );

你的代码中没有它。

如果您想使用PType2构建PType3,则必须在PType3之前定义PType2

答案 2 :(得分:0)

首先,PType2(const PType3 & ptype3)并未正式称为复制构造函数。从C ++的角度来看,它是PType2(const PType2 &)

我认为您缺少的是包含定义类PType3的头文件。

说过你提供的错误并不完全符合代码。在粘贴到stackoverflow之前是否修改了代码?

答案 3 :(得分:0)

通常情况下,我建议您阅读错误消息,但在这种情况下,它们会让您感到有些困惑。我想问题是你没有在PType3之前定义PType2,它实际上必须在你试图访问它的成员时完全定义(所以一个简单的前向声明不会做)

错误消息似乎来自支持默认为int的编译器。第一个错误是在这种情况下,因为编译器看到PType3并且因为它尚未声明它不是一个类型所以编译器假定它应该默认为int所以它认为{{1}是你的参数名称。然后它会混淆并使用户感到困惑(通过使用非直观的错误排序)。