无法访问对象的私有函数

问题描述:

我有一个任务,我无法编辑两个头文件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

在调用load_car()的car类的实现(即car.cpp中)中是否有任何地方?通常,当某人使某个方法像这样私人化时,他们会这样做,因为他们特别*不希望在该同一类之外的任何人调用该方法。所以这表明car.h的作者不希望你调用load_car()(除了可能来自car :: something()方法的实现,如果你被允许编辑car.cpp) –

+0

也许你可以使用文档中的'friend class':http://www.cplusplus.com/doc/tutorial/inheritance/,但@Dmitry指出,首先尝试。 – TuanDT

如果您不允许修改car.h,您将无法从拨打。

如果您不允许修改main,那么您的任务不正确。

如果您要创建自己的main,请在不拨打a.load_car()的情况下找到一种方法来完成您的任务。

As The Dark提到,load_car()函数是通过构造函数调用的,因此不应该在main()函数中调用。