2016-09-12 8 views
-2

У меня есть задание, в котором я не могу редактировать два файла заголовка, car.h и compass.h. В файле car.h есть частная функция, которая называется: void load_car();. Это позже определено в car.cpp как:Не удается получить доступ к частной функции объекта

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 
} 

Моя проблема заключается в том, что у меня есть основная функция,

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

return 0; 
} 

, где я не могу назвать частные функции члена объекта. Как я могу сделать это правильно, не изменяя заголовок car.h. Любая помощь будет принята с благодарностью.

Погрешность полученных при компиляции с г ++ является:

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(); 
      ^

Полный код приведен ниже: 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

Будьте предупреждены, что вы публикуете задание, основанное на задании, с довольно слабым описанием проблемы, которую довольно сложно сфотографировать с помощью кода без вставки, без предоставления самостоятельных запущенных примеров. Я не пойду, если вы не измените свой вопрос. Мой лучший совет состоит в том, чтобы разбить вашу проблему на самостоятельные тесты, фиксируя именно ту часть, которую вы не понимаете или не смущаете. Основываясь на вашем описании, вы сами не похожи на то, что знаете, о чем вы спрашиваете. – Dmitry

+0

Есть ли место в реализации класса автомобиля (т.е. внутри car.cpp), где вызывается load_car()? Обычно, когда кто-то делает такой метод приватным, они делают это, потому что они специально * не хотят, чтобы кто-либо из того же класса вызывал этот метод. Таким образом, это говорит о том, что автор car.h не хочет, чтобы вы вызывали load_car() (за исключением, возможно, от реализации метода car :: something(), если вам разрешено редактировать car.cpp) –

+0

Возможно, вы могли бы используйте класс 'friend 'из документации: http://www.cplusplus.com/doc/tutorial/inheritance/, но, как заметил @Dmitry, сначала попытайтесь. – TuanDT

ответ

2

Если вы не разрешается изменять car.h, вы не сможете позвонить по телефону a.load_car() от main.

Если вам не разрешено изменять main, у вас есть плохое назначение.

Если вы создаете свой собственный main, найдите способ выполнить свое задание без звонка a.load_car().

0

Как указано в Dark, функция load_car() вызывается через конструктор и поэтому не должна вызываться в функции main().

 Смежные вопросы

  • Нет связанных вопросов^_^