用构造函数初始化结构中的结构

Struct within a struct initialization with constructor

本文关键字:结构 初始化 构造函数      更新时间:2023-10-16

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

my头文件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

my code 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文件中的空构造函数。

那么这应该不能工作吗?

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

如果没有在构造函数初始化列表中为数据成员指定初始化式,则它们将被默认构造。Vertex3D对象没有默认构造函数,所以你会得到一个编译错误。

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

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

既然您定义了自定义的Vertex3D(float,float,float)构造函数,那么编译器将不再为您创建默认构造函数。Edgev2v3成员的默认初始化试图调用不存在的构造函数,因此出现错误。

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

Vertex3D::Vertex3D(float x0, float y0, float z0) : x(x0), y(y0), z(z0) { }