2017-04-27 10 views
0

Hallo das ist die Header-Datei für meine Basisklasse Ranger, und darin habe ich die Variablen fov_, usb_ ... geschützt, auf die ich mit meinen Getter-Funktionen zugreifen möchte, ich habe drei untergeordnete Klassen eingeschaltet dieses.Zugriff auf Variablen in der Basisklasse C++

Ranger.h

#ifndef RANGER_H 
 
#define RANGER_H 
 

 
using namespace std; 
 

 
class Ranger 
 
{ 
 
    //private contructor prevents contruction of base class 
 
    Ranger(); 
 
public: 
 
    void setBaud(int baud); 
 
    virtual void setFOV(int fov) = 0; 
 
    void setSamp(int sam); 
 
    int getFOV(); 
 
    int getBaud(); 
 
    int getMaxRange(); 
 
    int getUSB(); 
 
protected: 
 
    //protected variables that are each indivdualy owned by each sensor 
 
    int fov_; 
 
    int maxRange_; 
 
    int usb_; 
 
    int baud_; 
 
    int samp_; 
 
    double data[]; 
 
    //protected contructors for the child classes to use to set fixed parameters 
 
    Ranger(int fov, int maxRange, int port); 
 
    Ranger(int maxRange, int port); 
 
}; 
 

 
#endif // RANGER_H

Dies ist meine CPP-Datei für die Basisklasse, die die Getter-Dateien enthält, hat es nur eine Rückkehr der portected Variablen.

Ranger::Ranger() 
 
{ 
 

 
} 
 

 
Ranger::Ranger(int fov, int maxRange, int port) 
 
{ 
 
    fov_ = fov; 
 
    maxRange_ = maxRange; 
 
    usb_ = port; 
 
} 
 

 
Ranger::Ranger(int maxRange, int port) 
 
{ 
 
    maxRange_ = maxRange; 
 
    usb_ = port; 
 
} 
 

 
void Ranger::setBaud(int baud) 
 
{ 
 
    switch(baud) 
 
    { 
 
    case 0: baud_ = 38400; break; 
 
    case 1: baud_ = 115200; break; 
 
    default: baud_ = 38400; break; 
 
    } 
 
} 
 

 
void Ranger::setSamp(int sam) 
 
{ 
 
    samp_ = sam; 
 
} 
 

 
int Ranger::getFOV() 
 
{ 
 
    return fov_; 
 
} 
 

 
int Ranger::getBaud() 
 
{ 
 
    return baud_; 
 
} 
 

 
int Ranger::getMaxRange() 
 
{ 
 
    return maxRange_; 
 
} 
 

 
int Ranger::getUSB() 
 
{ 
 
    return usb_; 
 
}

Und in meinem Haupt mag ich die geschützten Variablen von der Basisklasse für den Zugriff auf Wieder writting Code zu verhindern, so sind jeweils Childs Variablen in der Basisklasse geschützt. Ich versuche, auf diese durch las.getFOV() zuzugreifen, aber ich bekomme einen Segmentierungsfehlerfehler, was bedeutet, dass ich keinen Zugriff darauf habe, und ich verstehe nicht ganz, warum.

main.cpp

int main(int argc, char ** argv) 
 
{ 
 
    Laser las; 
 
    int baud; 
 
    cout << "Baud:" << endl; 
 
    cout << "0 - 38400" << endl; 
 
    cout << "1 - 115200" << endl; 
 
    cin >> baud; 
 
    las.setBaud(baud); 
 
    cout << "Baud for Lazer sensor is "+las.getBaud() << endl; 
 
    cout << "Lazer sensor created..." << endl; 
 
    cout << "Lazer's FOV: " + las.getFOV() << endl; 
 
    cout << "Lazer's Max Range: " + las.getMaxRange() << endl; 
 
    cout << "Lazer's Port: " + las.getUSB() << endl; 
 
    Radar rad; 
 
    int baud2; 
 
    cout << "Baud:" << endl; 
 
    cout << "0 - 38400" << endl; 
 
    cout << "1 - 115200" << endl; 
 
    cin >> baud2; 
 
    rad.setBaud(baud2); 
 
    cout << "Baud for Radar sensor is "+rad.getFOV() << endl; 
 
    int fov; 
 
    cout << "Feild of View Of Radar:" << endl; 
 
    cout << "0 - 20 degrees" << endl; 
 
    cout << "1 - 40 degrees" << endl; 
 
    cin >> fov; 
 
    rad.setFOV(fov); 
 
    cout << "FOV is set to " + rad.getFOV() << endl; 
 
    cout << "Radar sensor created..." << endl; 
 
    cout << "Radar's FOV: ' " + rad.getFOV() << endl; 
 
    cout << "Radar's Max Range: " + rad.getMaxRange() << endl; 
 
    cout << "Radar's Port: " + rad.getUSB() << endl; 
 
    Sonar son; 
 
    //rad.setFOV(user); 
 

 
}

und hier ist einer der CPP-Datei des Kindes Klasse als Referenz (Lazer) laser.cpp

#include "laser.h" 
 

 
Laser::Laser() : Ranger(180,8,0) 
 
{ 
 
}; 
 

 
void Laser::setFOV(int fov) 
 
{ 
 
    fov_ = fov; 
 
}

laser.h

#ifndef LASER_H 
 
#define LASER_H 
 
#include "ranger.h" 
 
#include "rng.h" 
 

 
class Laser : public Ranger 
 
{ 
 
public: 
 
    Laser(); 
 
    void setFOV(int fov); 
 
}; 
 

 
#endif // LASER_H

+1

Es ist nichts falsch mit Ihren Gettern. Der in Ihrer Frage angezeigte Code erfüllt nicht die Anforderungen für [mcve]; Als solche ist keine autoritative Antwort möglich, aber der wahrscheinliche Grund für Ihren Absturz ist Ihr grundlegendes Missverständnis dessen, was 'double data []' Klassenmitglied ist, und Sie erwarten, dass es etwas anderes ist, als es tatsächlich ist. Überprüfen Sie Ihr C++ - Buch für weitere Informationen über Zeiger und Arrays. –

+1

'Ich versuche auf diese durch las.getFOV() zuzugreifen, aber ich bekomme einen Segmentierungsfehlerfehler, was bedeutet, dass ich keinen Zugriff darauf habe '- err no. Wenn Sie keinen Zugriff hätten, hätten Sie einen Fehler bei der Kompilierung, nicht einen Seg-Fehler. – John3136

Antwort

0

Dank jeder, kommentierte: Ich verstehe ich viel zu viel Code zu setzen euch aus, tut mir leid zu helfen, dass ich für das nächste Mal wissen werde, und thankyou ich kenne den Unterschied zwischen den Fehlern zu lassen, ich habe mehr Forschung getan und festgestellt, dass das Problem war, als ich es war Ausdruck Sie nicht verwenden können Operatoren wie:

cout<<""+function()<<endl; 

Stattdessen müssen Sie separa die Funktionen aus dem Array wie folgt:

cout<<""<<function()<<endl; 

Danke Jungs.

Verwandte Themen