我在寫一個簡單的程序來演示我對派生類的知識。使用派生類時的分段錯誤
我設置派生類的不同變量,然後將這些變量輸出到屏幕並循環numRobots
次。但是,在成功輸出第一次迭代之後,程序輸出segmentation fault (core dumped)
。我無法弄清楚爲什麼。
當我將它們用於第一次迭代時,所有派生類都可以工作。該程序不會循環到第二次迭代。
這裏是我的代碼:
#include <iostream>
#include <iomanip>
#include "abstractrobot.h"
#include "wrapperrobot.h"
#include "benderrobot.h"
#include "welderrobot.h"
using namespace std;
int main()
{
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.precision(2);
int numRobots;
int robotType;
string robotName;
cin >> numRobots;
for (int i = 0; i < numRobots; i++)
{
cin >> robotType;
cin >> robotName;
switch (robotType)
{
case 0:
{
WrapperRobot a_wrapper(robotName);
int numHours, numPackages;
cin >> numHours;
a_wrapper.set_numHours(numHours);
cin >> numPackages;
a_wrapper.set_numPackages(numPackages);
cout << "#" << i << ": ";
cout << a_wrapper.getName() << ", " << a_wrapper.getType()
<< " $" << a_wrapper.getPay() << endl;
break;
}
case 1:
{
BenderRobot a_bender(robotName);
int numReg, numExtra, numBends;
cin >> numReg;
a_bender.set_numReg(numReg);
cin >> numExtra;
a_bender.set_numExtra(numExtra);
cin >> numBends;
a_bender.set_numBends(numBends);
cout << "#" << i << ": ";
cout << a_bender.getName() << ", " << a_bender.getType()
<< " $" << a_bender.getPay() << endl;
break;
}
case 2:
{
WelderRobot a_welder(robotName);
int numReg, numExtra, numRad;
cin >> numReg;
a_welder.set_numReg(numReg);
cin >> numExtra;
a_welder.set_numExtra(numExtra);
cin >> numRad;
a_welder.set_numRad(numRad);
cout << "#" << i << ": ";
cout << a_welder.getName() << ", " << a_welder.getType()
<< " $" << a_welder.getPay() << endl;
break;
}
default:
cout << "Invalid type" << endl;
}
cout << "hello" << endl; // tester; the program never outputs this
}
return 0;
}
下面是0型機器人的頭文件:
#ifndef WRAPPERROBOT_H
#define WRAPPERROBOT_H
#include <string>
#include "abstractrobot.h"
using namespace std;
class WrapperRobot : public AbstractRobot
{
private:
float numHours;
float numPackages;
protected:
string c_name;
public:
const float c_rate = 0.25;
const float c_bonus = 0.05;
const string c_type = "Wrapper";
WrapperRobot(string n) : AbstractRobot(n) {c_name = n;}
virtual float getPay() const {return ((c_rate * numHours) +
(c_bonus * numPackages));}
virtual const string& getName() const {return c_name;}
virtual const string& getType() const {return c_type;}
virtual ~WrapperRobot() {delete this;}
void set_numHours(int n);
int get_numHours() {return numHours;}
void set_numPackages(int n);
int get_numPackages() {return numPackages;}
};
#endif
wrapperrobot.cpp
#include "wrapperrobot.h"
void WrapperRobot::set_numHours(int n)
{
numHours = n;
return;
}
void WrapperRobot::set_numPackages(int n)
{
numPackages = n;
return;
}
抽象類:
#ifndef ABSTRACTROBOT_H
#define ABSTRACTROBOT_H
#include <string>
using namespace std;
class AbstractRobot
{
protected:
string c_name;
public:
AbstractRobot(string n)
{
c_name = n;
}
virtual float getPay() const = 0;
virtual const string& getName() const = 0;
virtual const string& getType() const = 0;
virtual ~AbstractRobot() {}
};
#endif
這裏是我輸入:
4
0
Unit
10 20
程序輸出: #0: Unit, Wrapper $3.50
Segmentation fault (core dumped)
既然你說程序在第一次迭代後發生了段錯誤,那麼很可能是這個問題在破壞你的機器人的某個地方。你應該爲你的抽象機器人和一個具體的機器人包含代碼(至少是頭文件和析構函數體),當你在第一次迭代時選擇它的時候會出現這個問題。 – TerraPass
@TerraPass我已經添加了他們。 –