我一直试图找出过去一小时的错误,所以问。 即使我让我的参数化构造函数接受默认长度,但它在同一个类中正确显示它们但在我尝试使用它时在派生类 框 中返回0那里。
#include<iostream>
class rectangle
{
protected :
//int length=12,breadth=13; // LINE A
int length,breadth; // LINE B
public:
rectangle(){} // Empty default constructor
rectangle (int len , int br)
{
length =len ,breadth =br;
}
void area_rect()
{
std::cout << "\n Area is " << (length*breadth);
std::cout << "\n Length,Breadth : " << length << " "<<breadth<< "\n";
}
};
class box : public rectangle
{
int depth;
public:
box() {} // Again empty constructor of derived class
box(int d)
{
depth = d;
}
void area_box()
{
std::cout << "VOLUME IS : "<<(length*breadth*depth)<< "\n";
}
};
int main()
{
rectangle r(10,20);
r.area_rect();
box b(30);
b.area_box();
return 0;
}
- 取消注释行B,并且注释A给出
Area is 200
Length,Breadth : 10 20
VOLUME IS : 0
- 取消注释A行,并且注释B给出
Area is 200
Length,Breadth : 10 20
VOLUME IS : 4680
答案 0 :(得分:4)
总是应该在构造函数中初始化简单的成员变量:
rectangle() : length(0), breadth(0) {};
否则他们会保持“未初始化”,这意味着他们有垃圾价值。
对于对象成员变量(例如,如果你有std::string color;
作为rectangle
的另一个私有成员变量),则会调用默认构造函数。
派生类构造函数应调用(或隐式调用,如果忘记它)基类构造函数:
box () : rectangle () {}
BTW,使用所有警告和调试信息编译代码(如果使用GCC,例如g++ -Wall -g
),然后使用调试器(例如gdb
)逐步运行程序并查询各种数据。
另外,研究一些用C ++编写的自由软件的源代码;它会教你很多。