我得到了这段代码并想知道为什么在Class Cylinder行
Cylinder(double r, double h) : base (r), height(h) {}
不是
Cylinder(double r, double h) : base.radius (r), height(h) {}
我的意思是双人被移交,基地是一个圆筒,不应该是base.radius?
// member initialization
#include <iostream>
using namespace std;
class Circle {
double radius;
public:
Circle(double r) : radius(r) { }
double area() {return radius*radius*3.14159265;}
};
class Cylinder {
Circle base;
double height;
public:
Cylinder(double r, double h) : base (r), height(h) {}
double volume() {return base.area() * height;}
};
int main () {
Cylinder foo (10,20);
cout << "foo's volume: " << foo.volume() << '\n';
return 0;
}
答案 0 :(得分:3)
我得到了这段代码并想知道为什么在Class Cylinder行
Cylinder(double r, double h) : base (r), height(h) {}
不是
Cylinder(double r, double h) : base.radius (r), height(h) {}
调用base.radius (r)
无效,因为它是private
的{{1}}成员。
即使它不是Circle
,您也无法在构建初始化列表中访问它
使用private
构造函数来初始化Circle
是完全没问题的。
答案 1 :(得分:1)
首先,代码中没有继承。其次,当你调用radius
构造函数时,会构造它的成员。由于Cylinder
没有默认构造函数,因此必须确保在构造Circle
期间调用Cylinder
的构造函数。如果你有
Circle
编译器会抱怨Cylinder(double r, double h) : height(h) {}
缺少默认构造函数,因为如果你没有显式调用构造函数,那么Circle
将使用
Circle
不存在(因为Circle::Circle()
声明了不同的构造函数而被删除)。还
Circle
无法正常工作因为半径在中是私有的,因为您只能在初始化列表中初始化Cylinder(double r, double h) : base.radius (r), height(h) {}
Circle
的成员(甚至不允许基类的成员)。
答案 2 :(得分:1)
首先,这里的名字base
非常非常糟糕;你的Circle
对象不是基础!!
而且,不,类不能直接初始化其成员(或真实基础的成员)的成员。这将是一种利益冲突,责任混乱,敏感的冲突。
类提供接口来管理它,该接口由函数组成,而不是直接访问成员。如果你进入并改变Circle
的数据而不知道它就会有多么混乱!
使用构造函数初始化对象,让构造函数执行它认为正确的操作。在这种情况下,构造函数确实会按照您的意图设置radius
成员。
了解black boxes。