2016-09-12 17 views
-2

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

load_car()が呼び出されているcarクラスの実装(car.cpp内)の場所はありますか?通常、ある人がそのようなメソッドを非公開にすると、同じクラスの外部にいる誰もそのメソッドを呼びたくないからです。これは、car.hの作成者がload.cal()を呼びたくないことを示唆しています(おそらく、car :: something()メソッドの実装から、car.cppを編集することが許可されている場合は除きます) –

+0

http://www.cplusplus.com/doc/tutorial/inheritance/で、「友人クラス」を使用してください。しかし、@Dmitryが指摘したように、最初に試してみてください。 – TuanDT

答えて

2

あなたの場合car.hを変更することはできません。からa.load_car()に電話することはできません。

mainの変更が許可されていない場合、割り当てが不適切です。

mainを独自に作成している場合は、a.load_car()と呼ぶことなく割り当てを行う方法を見つけてください。

0

As Darkは、コンストラクタを介してload_car()関数が呼び出されたため、main()関数で呼び出されることは想定されていませんでした。

関連する問題