2012-04-28 21 views
1

私は完全なC++の初心者です。 私はかなり基本的なようないくつかのことをしようとしています:特定のクラスのオブジェクトを作成し、ベクトルに格納し、そのオブジェクトの値を出力します。現時点では、私が格納している文字に関係なく長方形の文字を出力します。何かアドバイスや背景情報が高く評価されオブジェクトがベクトルで正しく格納/検索されない(C++)

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <conio.h> 
#include <time.h> 
#include <windows.h> 
#include <vector> 
#include <algorithm> 
#include <map> 
using namespace std; 

class terrainType 
{ 
    public: 
     string name; 
     char symbol; 
     int freq; 
     terrainType(string,char,int); 
}; 
terrainType::terrainType(string name, char symbol, int freq) 
{ 
    name=name; 
    symbol=symbol; 
    freq=freq; 
} 

int main() 
{ 
    vector<terrainType> terrainTypes; 
    terrainType dirt("dirt",'.',1); 
    terrainTypes.push_back(dirt); 
    cout << terrainTypes[0].symbol; 
    return 0; 
} 

: は、ここでは、コードです。ありがとう!

答えて

5

あなたはコンストラクタを持っている3つの割り当てが効果的にノーオペレーション(あなたが自分自身に各変数を代入している)ではない:

terrainType::terrainType(string name, char symbol, int freq) 
{ 
    name=name; 
    symbol=symbol; 
    freq=freq; 
} 

問題は、nameと呼ばれる2つのものを持っている、とあなたが期待するということですコンパイラは、name=nameの中で、左側が一方を参照しているのに対し、右側が他方を参照していることを理解する。

この問題を解決するためにクリーンな方法はそうのようにコンストラクタに変更することです:

terrainType::terrainType(string name, char symbol, int freq) 
: name(name), 
    symbol(symbol), 
    freq(freq) 
{ 
} 

言語の規則が、これは意図した意味を持っているだろうようなものです。

別の方法は、メンバーと関数の引数の両方を参照するために同一の識別子を使用して回避することである。

terrainType::terrainType(string name_, char symbol_, int freq_) 
{ 
    name=name_; 
    symbol=symbol_; 
    freq=freq_; 
} 

さらに別の代替は、this->でメンバーのアクセスを付けることである。

terrainType::terrainType(string name, char symbol, int freq) 
{ 
    this->name=name; 
    this->symbol=symbol; 
    this->freq=freq; 
} 
+0

あるいは、 'this-> name'などを通してデータメンバにアクセスしてください。もちろん、メンバの初期化はコンストラクタでうまくいきます。 – chris

+0

ありがとうございました。私は変数名を変更し、それは完全に動作します。 – Austen

+1

これは、データメンバーの先頭にアンダースコアを付ける理由の1つです。それは私が下線なしで、そして面倒なく、同じ名前を関数で使用することを可能にします。 – chris

関連する問題