2016-09-12 2 views
-2

Ich habe eine Zuweisung, in der ich zwei Header-Dateien, car.h und compass.h nicht bearbeiten kann. In der Datei car.h gibt es eine private Funktion namens void load_car();. Dies wird später in car.cpp wie folgt definiert:Problem beim Zugriff auf eine private Funktion eines Objekts

void car::load_car(){ 
cout << "Please enter make and model:" << endl; 
ifstream inFile; 
string fileName; 
fileName = (make + "-" + model + ".txt"); 
inFile.open(fileName.c_str()); 
//not a finished function 
} 

Mein Problem ist, dass ich eine Hauptfunktion haben,

int main() { 
cin >> make >> model; 
car a(make, model); 
a.load_car(); 

return 0; 
} 

, wo ich das nicht privat Objekts Member-Funktion aufrufen können. Wie kann ich das richtig machen, ohne den car.h-Header zu verändern? Jede Hilfe würde sehr geschätzt werden.

Der Fehler erhalten, wenn sie mit g ++ kompiliert:

In file included from car.cpp:2:0: 
car.h: In function ‘int main()’: 
car.h:22:7: error: ‘void car::load_car()’ is private 
    void load_car(); 
    ^
car.cpp:14:13: error: within this context 
    a.load_car(); 
      ^

Der vollständige Code wird auch weiter unten: car.cpp

#include "compass.h" 
#include "car.h" 
#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

string make, model; 

int main() { 
    cin >> make >> model; 
    car a(make,model); 
    a.load_car(); 


    return 0; 
} 

void car::load_car(){ 

    cout << "Please enter make and model:" << endl; 
    ifstream inFile; 
    string fileName; 
    fileName = (make + "-" + model + ".txt"); 
    inFile.open(fileName.c_str()); 
} 

car.h

#ifndef CAR_H 
#define CAR_H 

#include <string> 
#include "compass.h" 

//Relative direction 
enum class rDir {left, right}; 

class car 
{ 
private: 
    std::string make, model; 
    int topSpeed, horsepower, mass; 
    double currentSpeed = 0; 

//Defined by compass.h: an x/y coordinate struct and cardinal direction. 
    coordinates position; 
    compass direction; 

//Helper functions 
    void load_car(); 
    void update_position(); 
public: 

//Constructor/Destructor 
    car (std::string ma, std::string mo) : make (ma), model (mo) {load_car();} 
    ~car() {}; 

//Getters 
    std::string get_make() {return make;} 
    std::string get_model() {return model;} 
    coordinates get_position() {return position;} 
    compass get_direction() {return direction;} 
    double get_speed() {return currentSpeed;} 

//Things cars do 
    void accelerate(); 
    void brake(); 
    void coast(); 
    void steer (rDir turn); 
}; 


#endif // CAR_H 
+3

Seien Sie gewarnt, dass Sie eine Aufgabe mit einer ziemlich schwachen Beschreibung des Problems veröffentlichen, die ziemlich schwer zu überfliegen ist, mit nicht eingerücktem Code, ohne eigenständige runable Beispiele zu liefern. Ich werde nicht gut gehen, wenn Sie Ihre Frage nicht ändern. Mein bester Rat ist, Ihr Problem in eigenständige Tests zu zerlegen, die genau den Teil erfassen, den Sie nicht verstehen oder verwirren. Basierend auf Ihrer Beschreibung scheinen Sie selbst nicht zu wissen, was Sie fragen. – Dmitry

+0

Gibt es einen Platz in der Auto-Klassen-Implementierung (d. H. In car.cpp) wo load_car() aufgerufen wird? Normalerweise, wenn jemand eine Methode privat so macht, tun sie dies, weil sie * spezifisch * niemanden außerhalb der gleichen Klasse wollen, der diese Methode aufruft. Das deutet also darauf hin, dass der Autor von car.h nicht möchte, dass Sie load_car() aufrufen (außer vielleicht von der Implementierung einer car :: something() -Methode, wenn Sie car.cpp bearbeiten dürfen) –

+0

Vielleicht könnten Sie Verwenden Sie die 'Freundklasse' aus der Dokumentation: http://www.cplusplus.com/doc/tutorial/inheritance/, aber wie @Dmitry darauf hingewiesen hat, versuchen Sie es zuerst. – TuanDT

Antwort

2

Wenn Sie dürfen car.h nicht ändern, Sie können a.load_car() nicht vonanrufen.

Wenn Sie nicht ändern können main, haben Sie eine schlechte Zuordnung.

Wenn Sie Ihre eigenen main erstellen, finden Sie einen Weg, um Ihre Aufgabe ohne Aufruf a.load_car() zu tun.

0

Wie The Dark erwähnt, wird die load_car() - Funktion über den Konstruktor aufgerufen und sollte daher in der main() - Funktion nicht aufgerufen werden.

Verwandte Themen