Yeo*_*ari 1 c++ inheritance constructor class object
在我的大学课堂上,我们正在处理继承问题,尽管我教授的代码让我感到困惑并且似乎有点不对劲。
class Circle
{
protected:
double radius;
public:
Circle(double = 1.0);
double calcval();
};
Circle::Circle(double r)
{
radius = r;
}
Run Code Online (Sandbox Code Playgroud)
在这里,她在类中创建一个默认构造函数,然后在类外部创建一个单独的用户定义构造函数。当我最初看到这一点时,我认为必须有一种方法可以更有效地做到这一点,从而占用更少的空间,使代码更具可读性。
经过一些在线搜索后,我找到了一些我尝试过的资源,尽管我仍然遇到一些错误。这是我尝试过的“Circle”类的构造函数。
class Circle
{
protected:
double radius;
public:
double calcVal();
Circle(double r = 1.0) : radius(r) {}
};
Run Code Online (Sandbox Code Playgroud)
它是否正确?我试图使默认构造函数设置 radius = 1.0 并有一个构造函数将 radius = 设置为“r”(用户输入)。
我们还有另一个派生类“Cylinder”,我尝试做类似的事情但收到错误。
这是我教授的实现。
class Cylinder : public Circle
{
protected:
double length;
double volume;
public:
Cylinder(double r, double len);
double calcval();
};
Cylinder::Cylinder(double r, double len){
length =len;
this->radius =r;
}
Run Code Online (Sandbox Code Playgroud)
然后这就是我尝试的。
class Cylinder : public Circle
{
private:
double length;
double volume;
public:
double calcVal();
Cylinder(double r, double len) : length(len) this->radius(r) {}
};
Run Code Online (Sandbox Code Playgroud)
但是,我在“this”的开头收到一个错误,其中显示“需要一个“{””。
如果可能的话,我如何在同一行中创建默认构造函数和用户定义构造函数,以提高代码的可读性和简洁性?非常感谢您的阅读。
为了您的方便,我的整体实施。:)
class Circle
{
protected:
double radius;
public:
double calcVal();
Circle(double r = 1.0) : radius(r) {}
};
double Circle::calcVal()
{
return (PI * (radius * radius));
}
class Cylinder : public Circle
{
private:
double length;
double volume;
public:
double calcVal();
Cylinder(double r, double len) : length(len) this->radius(r) {}
};
double Cylinder::calcVal()
{
return (length * PI * (r * r));
}
Run Code Online (Sandbox Code Playgroud)
在这里,她在类中创建一个默认构造函数,然后在类外部创建一个单独的用户定义构造函数。
不,她在类声明中声明默认构造函数,然后在类声明之外定义该构造函数的主体。这是完全合法且正确的代码。
我仍然收到一些错误
那是因为你的代码中有错误。
这是我尝试过的类“Circle”的构造函数......这是正确的吗?
在那个例子中,是的。
我们还有另一个派生类“Cylinder”,我尝试做类似的事情但收到错误...然后这是我尝试的...但是,我在“this”的开头收到一个错误,上面写着“expected a” {“。”
既然radius是 的成员Circle,您应该让Circle构造函数初始化radius。不要在派生Cylinder的构造函数中这样做。但是,您自己没有调用 的Circle构造函数,因此编译器会为您调用它,并传入其默认参数值。
,您的构造函数成员初始化列表中还缺少 a Cylinder,这是一个语法错误。
试试这个:
Cylinder(double r, double len) : Circle(r), length(len) {}
Run Code Online (Sandbox Code Playgroud)
话虽如此,代码中还有一些其他事情值得指出。
您的Cylinder类有一个volume从未初始化或使用的成员,因此应该将其完全删除。
Cylinder::calcVal(),内部r未定义。Circle它只是和构造函数中的局部变量Cylinder。您需要改用radius成员(就像如何使用成员Circle::calcVal()而不是构造函数参数一样),例如:Cylinder::calcVal()lengthlen
return (length * PI * (radius * radius));
Run Code Online (Sandbox Code Playgroud)
double calcVal();您在两个类中进行声明,Circle::calcVal()但未标记为virtual,因此Cylinder::calcVal()不会覆盖它。如果您要创建Circle*/Circle&引用一个Cylinder对象,然后调用calcVal()它,则只会Circle::calcVal()被调用,而不是Cylinder::calcVal()。因此,使Circle::calcVal()虚拟,例如:
virtual double calcVal();
Run Code Online (Sandbox Code Playgroud)
为了更好地衡量,Cylinder应该将其标记calcVal()为override:
double calcVal() override;
Run Code Online (Sandbox Code Playgroud)
由于您想降低类的复杂性,因此可以内联calcVal()这两个类,例如:
class Circle
{
protected:
double radius;
public:
virtual double calcVal() { return (PI * (radius * radius)); }
Circle(double r = 1.0) : radius(r) {}
};
class Cylinder : public Circle
{
private:
double length;
public:
double calcVal() override { return (length * PI * (radius * radius)); }
Cylinder(double r, double len) : Circle(r), length(len) {}
};
Run Code Online (Sandbox Code Playgroud)
然后,由于Circle::calcVal()和Cylinder::calcVal()都计算相同的PI * radius * radius值,其中Cylinder只是将结果乘以length,您实际上可以调用Circle::calcVal()的内部Cylinder::calcVal()来完成常见的工作,例如:
double calcVal() override { return (length * Circle::calcVal());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
330 次 |
| 最近记录: |