2017-04-14 4 views
-3

私は関数内で作った構造体を出力しようとしています。これらはポインタを使った関数の外で利用可能でなければならないからです。私は、ヘッダファイル内でこのような構造体と関数を宣言した:構造体ポインタを出力するには?

struct Car{ 
double wheelDiam; 
int numberOfWheels; 
string brand; 
}; 

void makeCars(); 

ostream & operator<<(ostream & out, const Car & elem); 
void printCar(Car car); 

車を作る機能は次のようになります。私は構造体をプリントアウト別の関数を(作った

void makeCars(){ 
    Car *AstonMartin; 
    Car *Volvo; 
    Car *Audi; 
    Audi->numberOfWheels = 4; 
    Audi->wheelDiam = 20.0; 
    Audi->brand = "Audi"; 
    Volvo->numberOfWheels = 4; 
    Volvo->wheelDiam = 23.0; 
    Volvo->brand = "Volvo"; 
    AstonMartin->numberOfWheels = 5; 
    AstonMartin->wheelDiam = 25.0; 
    AstonMartin->brand = "Aston Martin"; 

} 

とオーバーロードされた演算子=):

ostream & operator<<(ostream & out, const Car & elem){ 
    out << elem.brand<<" "<<elem.numberOfWheels <<" "<<elem.wheelDiam<<endl; 
    return out; 
} 

void printCar(Car car){ 
    cout << car << endl; 
} 

が、私がメインで関数を呼び出すとき()、それは何も印刷されないと、私はエラーメッセージを取得:

int main(){ 
makeCars(); 
printCar(*AstonMartin); 
return 0 
} 

これを行う正しい方法は何ですか?

+1

基本の一部をリフレッシュする必要があると思います。まず、AstonMartinはmakeCars()関数のローカル変数です。メインでは使用できません。第2に、あなたはオブジェクトを作成していません。 'Car * AstonMartin'はポインタを宣言しただけですが、実際には' new car'を作成しません。最後に、たとえあなたがしたとしても、オブジェクトを削除する必要があります。 – CompuChip

+0

[The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c)から良いものを選んでください。 -book-guide-and-list)を参照してください。 – molbdnilo

答えて

0

まず、変数Car * AstonMartinを関数内に宣言します。この変数は実際にはmakeCars関数内にのみです。

、あなたのオブジェクトを使用するかもそれ

行うには良い方法がある削除することはできません

void setCarAttributes(Car *c) 
{ 
    // set everything for you car 
    c->setBrand("Aston Martin"); 
    // etc ... 
} 

void printCar() 
{ 
    // print what you want 

}

int main() 
{ 
    Car *AstonMartin = new Car(); 
    setCarAttributes(AstonMartin); 
    printCar(AstomMartin); 
} 

用事あなたの関数に宣言する変数に」他の機能で使用することができます。変数をどこでも使用するには、グローバル変数を宣言する必要がありますが、この場合は単にCar *を宣言して関数にパラメータとして渡す必要はありません。

関連する問題