1

私は完全な 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;
}

アドバイスや背景情報をいただければ幸いです。ありがとう!

4

1 に答える 1

5

コンストラクターにある 3 つの割り当ては、事実上 no-ops です (各変数をそれ自体に割り当てています)。

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

問題は、 と呼ばれる 2 つのものがあり、左側がそれらの一方を参照し、右側が他方を参照しているnameことをコンパイラが理解することを期待していることです。name=name

これを修正する最もクリーンな方法は、次のようにコンストラクターに変更することです。

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

言語の規則は、これが意図した意味を持つようになっています。

もう 1 つの方法は、メンバーと関数の引数の両方を参照するために同じ識別子を使用しないようにすることです。

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;
}
于 2012-04-28T20:49:25.723 に答える