使用构造函数在struct初始化中构造

时间:2015-09-25 08:17:26

标签: c++ struct constructor

我试图通过发送两个其他结构来初始化我的结构与构造函数。

我的头文件Datatypes.h:

#ifndef __DATATYPES_H__
#define __DATATYPES_H__

struct Vertex3D {
  float x,y,z;

  Vertex3D(float x0, float y0, float z0);
};


struct Edge {
Vertex3D v0, v1;
Edge(Vertex3D v2, Vertex3D v3); 

};

#endif

我的代码Datatypes.cc

#include "Datatypes.h"

using namespace std;

Vertex3D::Vertex3D(float x0, float y0, float z0) {

x = x0;
y = y0;
z = z0;
}

Edge::Edge(Vertex3D v2, Vertex3D v3) {

v0 = v2;
v1 = v3;

当我尝试编译时出现问题,似乎编译器试图在.cc文件中调用空构造函数。

所以不应该这样做吗?

2 个答案:

答案 0 :(得分:3)

Edge::Edge(Vertex3D v2, Vertex3D v3) {
    v0 = v2;
    v1 = v3;
}

如果未在构造函数初始化列表中为数据成员指定初始值设定项,则它们将默认构造。 Vertex3D对象没有默认构造函数,因此您将收到编译器错误。

您应该通过初始化初始化列表中的成员来解决此问题:

Edge::Edge(Vertex3D v2, Vertex3D v3) 
  : v0(v2), v1(v3) 
{ }

答案 1 :(得分:1)

由于您定义了自定义Vertex3D(float,float,float)构造函数,因此编译器不再为您创建默认构造函数。 v2的{​​{1}}和v3成员的默认初始化尝试调用该不存在的构造函数,因此出错。

您应该像这样初始化类成员,以避免不必要的复制并修复错误:

Edge