C++ 无法将初始值设定项列表与继承合并

C++ 无法将初始值设定项列表与继承合并,c++,inheritance,initializer-list,C++,Inheritance,Initializer List,我有一些代码,我希望类实例能够在初始化器中初始化变量,同时调用其初始化器列表中的父类构造函数。这个父类构造函数将在它自己的构造函数的初始值设定项列表中初始化三个额外的变量 下面是一些在不同类上使用这些构造函数的代码: class Vec3f { public: inline Vec3f () : x (0), y (0), z (0) {} inline Vec3f (float xx, float yy, float zz) : x (xx), y (yy), z (zz) { }

我有一些代码,我希望类实例能够在初始化器中初始化变量,同时调用其初始化器列表中的父类构造函数。这个父类构造函数将在它自己的构造函数的初始值设定项列表中初始化三个额外的变量

下面是一些在不同类上使用这些构造函数的代码:

class Vec3f {
public:
  inline Vec3f () : x (0), y (0), z (0) {}
  inline Vec3f (float xx, float yy, float zz) : x (xx), y (yy), z (zz)  { }
private:
  float x,y,z;
};

class Vec4f : Vec3f {
   public:
      inline Vec4f (): Vec3f(), w(0) {}
      inline Vec4f (float a,float b,float c,float d): Vec3f (a,b,c), w(d) {}
private:
    float w;
};

class Matrix4x4 {
   public:
      void setIdentity ();
    private:
      Vec4f row1, row2, row3, row4;
};

void Matrix4x4::setIdentity () {
  row1 (1.0f,0.0f,0.0f,0.0f);
  row2 (0.0f,1.0f,0.0f,0.0f);
  row3 (0.0f,0.0f,1.0f,0.0f);
  row4 (0.0f,0.0f,0.0f,1.0f);
}


main () {
   Matrix4x4 a;
   a.setIdentity ();
}
当我运行上述代码时,我收到:

test.cpp: In member function ‘void    Matrix4x4::setIdentity()’:
test.cpp:26: error: no match for call to ‘(Vec4f) (float, float, float, float)’
test.cpp:27: error: no match for call to ‘(Vec4f) (float, float, float, float)’
test.cpp:28: error: no match for call to ‘(Vec4f) (float, float, float, float)’
test.cpp:29: error: no match for call to ‘(Vec4f) (float, float, float, float)’
在另一个留言板上,有人建议:

class Vec3f {
public:
  inline Vec3f () : x (0), y (0), z (0) {}
  inline Vec3f (float xx, float yy, float zz) : x (xx), y (yy), z (zz)  { }
  inline void Set3f (float xx, float yy, float zz) {
    x = (xx);
    y = (yy);
    z = (zz);
  }
private:
  float x,y,z;
};

class Vec4f : Vec3f
{
   public:
     inline Vec4f (): Vec3f(), w(0) {}
     inline Vec4f (float a,float b,float c,float d): Vec3f (a,b,c), w(d) {}
     inline void Set4f (float a,float b,float c,float d) {
     Set3f(a,b,c);
     w = d;
     }
   private:
     float w;
};

class Matrix4x4 {
  public:
    void setIdentity ();
    Matrix4x4() :
      row1 (1.0f,0.0f,0.0f,0.0f),
      row2 (0.0f,1.0f,0.0f,0.0f),
      row3 (0.0f,0.0f,1.0f,0.0f),
      row4 (0.0f,0.0f,0.0f,1.0f)
   {}
  private:
     Vec4f row1, row2, row3, row4;
};

void Matrix4x4::setIdentity () {
  row1.Set4f(1.0f,0.0f,0.0f,0.0f);
  row2.Set4f(0.0f,1.0f,0.0f,0.0f);
  row3.Set4f(0.0f,0.0f,1.0f,0.0f);
  row4.Set4f(0.0f,0.0f,0.0f,1.0f);
}


int main () {
  Matrix4x4 a;
  a.setIdentity ();
}

然而,这对我来说似乎是一个难题。不想调用两个setter方法。最好只在普通构造函数中执行我需要的操作,代码更少。所以我问:为什么C++不允许构造函数初始化列表按照我想要的方式工作?< /p> < p>您没有使用<代码> SETIDEnTyTE()/Cuth>中的构造函数初始化列表,这就是为什么代码失败的原因。
Vec4f
不实现
操作符()
(the),因此

row1(1.0f、0.0f、0.0f、0.0f)

setIdentity()
的内部不起作用,而且它们也不会做你认为它们会做的事情

您可能打算构造新的
Vec4f
实例并将它们分配给现有变量,例如:

void Matrix4x4::setIdentity () {
  row1 = Vec4f(1.0f,0.0f,0.0f,0.0f);
  row2 = Vec4f(0.0f,1.0f,0.0f,0.0f);
  row3 = Vec4f(0.0f,0.0f,1.0f,0.0f);
  row4 = Vec4f(0.0f,0.0f,0.0f,1.0f);
}

您没有在
setIdentity()
中使用构造函数的初始值设定项列表,这就是代码失败的原因

Vec4f
不实现
操作符()
(the),因此

row1(1.0f、0.0f、0.0f、0.0f)

setIdentity()
的内部不起作用,而且它们也不会做你认为它们会做的事情

您可能打算构造新的
Vec4f
实例并将它们分配给现有变量,例如:

void Matrix4x4::setIdentity () {
  row1 = Vec4f(1.0f,0.0f,0.0f,0.0f);
  row2 = Vec4f(0.0f,1.0f,0.0f,0.0f);
  row3 = Vec4f(0.0f,0.0f,1.0f,0.0f);
  row4 = Vec4f(0.0f,0.0f,0.0f,1.0f);
}