4

私は C++ を学んでいますがstruct、配列に問題があります。私の構造体は次のとおりです。

struct board
{
    string name;
    string desc;
    int nval;
    int sval;
    int eval;
    int wval;
};

私の配列は次のようになります。

board field[10][10];

たとえば、次のことができます。

field[5][6].name = "ExampleName";
field[5][6].desc = "This is an example";
field[5][6].nval = 3;
//and so on...

しかし、次のように、構造全体に一度に割り当てたいと思います。

field[5][6] = {"ExampleName", "This is an example", 3, 4, 5, 6};
//so I don't have to type everything over and over again...
4

6 に答える 6

3

あなたがやろうとしていることはC標準で許可されています。C++でも動作しているようです。C++11で確認しました。

struct board
{
string name;
string desc;
int nval;
int sval;
int eval;
int wval;
}field[10][10];

int main()
{    
field[5][6]={"ExampleName","This is an example",3,4,5,6};
cout<<field[5][6].name<<endl;
cout<<field[5][6].sval<<endl;
return 0;
}

正しく印刷されています。だからあなたはそれをすることができるはずです。

于 2012-04-14T13:50:40.560 に答える
2

すでに述べたように、C99とC#はその構文の形式をサポートしていますが、標準のC++はサポートしていません。構造体にコンストラクターを追加することでそれを行うことができます。これはANSICとの互換性がなくなることに注意してください。

struct board
{
    string name;
    string desc;
    int nval;
    int sval;
    int eval;
    int wval;

    board()
    {
    }

    board(string name, string desc, int nval, int sval, int eval, int wval)
    {
        this->name = name;
        this->desc = desc;
        this->nval = nval;
        this->sval = sval;
        this->eval = eval;
        this->wval = wval;
    }
};

field[1][2] = board("name", "desc", 1, 2, 3, 4);

于 2012-04-14T13:46:25.800 に答える
2

パラメーターを受け取るコンストラクターを定義すると、一時的なものを作成し、それを使用して特定の要素を初期化できます。コンストラクターも定義してデフォルトにする必要があります。

struct board
{
   string name;
   string desc;
   int nval;
   int sval;
   int eval;
   int wval;

   board():
     name(""),
     desc(""),
     nval(0),
     sval(0),
     eval(0),
     wval(0){}

   board(
     const string& name,
     const string& desc,
     int nval,
     int sval,
     int eval,
     int wval):
   name(name),
   desc(desc),
   nval(nval),
   sval(sval),
   eval(eval),
   wval(wval){}
};

int main()
{
   board field[10][10];
   field[5][6]= board("ExampleName","This is an example",3,4,5,6);
   return 0;
}
于 2012-04-14T13:48:19.437 に答える
2

私はあなたがこの方法でそれを行うことができないことを恐れています.

しかし、通常はこの種のフィールドを手動で入力する必要がないため、実際には問題ありません。通常はループで実行します。

ランタイムの初期化を気にしない場合は、次のようにします。

    // in the beginning make these arrays
string names[10*10] = {
    "example 1 name"
    "example 2 name"
    "blah blah blah "
};

string descriptions[100] = {

};
//and then just loop through that

int i,j;
for (int k = 0; k != 10*10; ++k) { // 10*10 size of a board
        if (j == 10) {
            j = 0;
            i++
        }

        field[i][j].name = names[k]// get it from names
        field[i][j].desc = // get somehow the description,...
        ++j
    }

}
于 2012-04-14T13:38:12.520 に答える
1

100個のフィールドすべてに対して厳選された値を定義する必要がある場合は、すべての引数をテキストファイルに書き込んでからファイルを解析し、抽出された値を配列に入力することで、より簡単に定義できます。ファイルは次のようになります

0 0
Corner field
Here it begins
0 1 2 3

0 1
ExampleName
This is an example
3 4 5 6

等々。次に、ファイルを読み取るときに、istream::getlineテキスト文字列のistream::operator>>抽出と数値の抽出に使用できます。

しかし、それでも多くの苦痛があります。少なくともほとんどの値を自動的に生成する方法がないことを確認しますか?

于 2012-04-14T13:48:22.087 に答える
0

1行で何を意味するのか、質問はあまり明確ではないので、提案を提供し始めます。

集計の初期化を使用します。

board fields[10][10] = { 
                  { {"ExampleName","This is an example",3,4,5,6}, // Element 0,0
                    {"ExampleName","This is an example",3,4,5,6}, // Element 0,1
                // ...
                  },
                  { {"ExampleName","This is an example",3,4,5,6}, // Element 1,0
                // ... 
                  }
                };

これは取得できるワンライナーに最も近いもので、有効な C++ です (すべてのバリアントで、これがboard集約であるため、集約でboard[10][10]もあります) が、読みにくい場合があります。

次のステップは、(配列ではなく) 各要素を初期化することです。C++ 11 では、提案したのと同じタイプの初期化を使用できます。C++03 では、コンストラクターを介してこれを行う必要があります (注: これにより型のプロパティが変更されるため、配列の既定のコンストラクターを作成する必要があります)。

 struct board {
    string name;
    string desc;
    int nval;
    int sval;
    int eval;
    int wval;
    board() {}  // [*]
    board( const char* name, const char* desc, int n, int s, int e, int w )
       : name(name), desc(desc), nval(n), sval(s), eval(e), wval(w)
    {}
 };
 board fields[10][10];  // [*] this requires the default constructor [*]

 fields[5][6] = board("ExampleName","This is an example",3,4,5,6);

または関数を介して:

board create_board( const char* name, const char* desc, ... ) {
   board res = { name, desc, ... };
   return res;
}

どちらの場合も、配列の初期化中に配列内の要素が初期化され、新しいオブジェクトがそれらの上にコピーされることに注意してください。

于 2012-04-15T00:18:24.010 に答える