2016-03-24 17 views
-1

我在寫一個簡單的程序來演示我對派生類的知識。使用派生類時的分段錯誤

我設置派生類的不同變量,然後將這些變量輸出到屏幕並循環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)

+0

既然你說程序在第一次迭代後發生了段錯誤,那麼很可能是這個問題在破壞你的機器人的某個地方。你應該爲你的抽象機器人和一個具體的機器人包含代碼(至少是頭文件和析構函數體),當你在第一次迭代時選擇它的時候會出現這個問題。 – TerraPass

+0

@TerraPass我已經添加了他們。 –

回答

0
​​

不要從析構函數做delete this;,永遠。當其他人delete是你的對象時,或者在你的情況下,當它被分配到堆棧後,一旦其作用域結束時它被自動銷燬,析構函數被調用。如果您不需要釋放任何內存或釋放析構函數中的任何資源,請將其主體留空。

我真的很驚訝,你有一個段錯誤,而不是堆棧溢出,因爲delete this;在析構函數應該觸發無限遞歸。 編輯:或者至少我是,直到我GOOGLE搜索this question

+0

我剛剛注意到了!並擺脫它。它似乎已經解決了這個問題。 –

+0

http://stackoverflow.com/questions/3150942/c-delete-this – nrussell