C++ 试图为从类继承的子类编写构造函数,猜测语法,预期主表达式错误?

C++ 试图为从类继承的子类编写构造函数,猜测语法,预期主表达式错误?,c++,inheritance,constructor,C++,Inheritance,Constructor,我有一个从类形状继承的类球体(用于家庭作业项目): 在Shape中,我有三个构造函数。Shape.h中的声明如下: Shape(); Shape(Vector); Shape(Vector, float[]); Sphere(): Shape() {}//line 17 Sphere(Vector, float): Shape(Vector) {}//line 18 Sphere(Vector, float, float[]): Shape(Vector, float[]) {}//line

我有一个从类形状继承的类球体(用于家庭作业项目):

在Shape中,我有三个构造函数。Shape.h中的声明如下:

Shape();
Shape(Vector);
Shape(Vector, float[]);
Sphere(): Shape() {}//line 17
Sphere(Vector, float): Shape(Vector) {}//line 18
Sphere(Vector, float, float[]): Shape(Vector, float[]) {}//line 19
在球体中,我的构造函数继承自这些构造函数。我的Sphere.h文件中的声明如下:

Shape();
Shape(Vector);
Shape(Vector, float[]);
Sphere(): Shape() {}//line 17
Sphere(Vector, float): Shape(Vector) {}//line 18
Sphere(Vector, float, float[]): Shape(Vector, float[]) {}//line 19
我这里的语法主要基于模板。虽然我的第一语言是C++,但不幸的是,我只教给了其他概念,比如继承,只是用java。 无论如何,我在“make”时有以下错误消息:

Sphere.h: In constructor ‘Sphere::Sphere(Vector, float)’:
Sphere.h:18: error: expected primary-expression before ‘)’ token
Sphere.h: In constructor ‘Sphere::Sphere(Vector, float, float*)’:
Sphere.h:19: error: expected primary-expression before ‘,’ token
Sphere.h:19: error: expected primary-expression before ‘float’
你能帮我理解这些信息吗?是什么导致了这些信息?我首先尝试让他们以典型的方式表达,即,代替

Sphere(): Shape();
然后在.cc文件中描述构造函数本身,就像我在一些在线教程中看到的那样,我没有真正理解为什么:

Sphere(): Shape() {}

这没有改变任何事情,问题依然存在。谢谢你的帮助

您还没有为构造函数参数指定任何名称


这没关系,只要你不想使用这些参数

您需要为参数指定名称,而不仅仅是类型,并传递名称,而不是类型。例如:

Sphere(Vector a, float b, float[] c): Shape(a, c) {}

初始化列表属于构造函数的实现,不属于构造函数声明(或原型)的一部分。你似乎把两者都放在一起了

您可以执行以下任一操作:

// Sphere.h
struct Sphere {
  Sphere();
};

// Sphere.cpp
Sphere::Sphere() : Shape() {

}
或者你可以:

// Sphere.h
struct Sphere {
  Sphere() : Shape() { }
};

// Sphere.cpp
// No constructor here; you defined it in the header.

在构造函数声明中(不是在.h中),参数需要名称,以便它知道如何将它们存储为.Kris,这是.h文件。那么,这不是应该的吗?我想.h文件中应该列出参数类型。通常在C++中,你可以声明和实现。声明(
.h
)中的纯类型参数说明符是可以的,尽管即使在声明中,我还是喜欢命名参数。。。但是,正如其他人所指出的那样,您在实现中肯定需要名称(
.cc
),原型不需要名称,所以您发布的第一个代码块就可以了。第二个,定义?我不懂术语…--需要有变量名。是的,正如大卫所说,将两者分开是一种很好的做法。原型通常放在一个单独的.h文件中,而方法实现放在它们自己的.cpp文件中。我之所以指出这一点,主要是因为Java/C不以这种方式分离接口和实现。我想我理解你的意思,但我也遇到了类似的错误。我听从了你的建议,所以现在我的第二个构造函数原型为Sphere(Vector,float);在.h文件中,实现为Sphere::Sphere(Vector pos,float rad):Shape(Vector){/*代码在这里*/}在.cc文件中。现在我得到了以下错误:Sphere.cc:22:error:expected primary expression before'),我所看到的一切都表明.h文件中构造函数参数的原型只列出了变量类型,而在.cc文件中实现它的实际定义行给出了这些参数的名称。我错过了什么?就是这个!我没有意识到我不应该将类型传递给使用过的超类构造函数!谢谢,杰瑞。