0
#include<iostream>
#include<string>
using namespace std;
int main(void) {

    struct STRCT {
        int num;
        string str1,
               arrStr1[],
               str2,
               arrStr2[];
    };

    int a;
    string b[2],
           c[3],
           d,
           e;

    a = 10;

    b[0] = "hello";
    b[1] = "world";

    c[0] = "stack";
    c[1] = "over";
    c[2] = "flow";

    d = "random";
    e = "text";

    //how do i intialize the arrays (arrStr1[] and arrStr2[]) in aStruct along with the rest of items?
    //is it like this?

    //i want aStruct[] to be an array and i want its size to be declared from the start to later be filled with vals

    STRCT aStruct[2];

    //then later in the program i want to assign aStruct[] vals

    aStruct[0] = {a,      //int
                  d,      //string
                  {b},    //string[]
                  e,      //string
                  {c}};   //string[]
}

基本的に、内部に配列を含む構造体配列を作成し、適切な値を取得してから、構造体配列内の配列に適切な値を割り当てたいと考えています。助けてくれてありがとう

4

2 に答える 2

3

構造体の配列宣言は単に違法です。C++ は、サイズのない配列宣言をクラス メンバーとしてサポートしていません。また、一部の C++ コンパイラが C99 スタイルの「構造体ハック」宣言をサポートしている場合でも、サイズのない配列は 1 つだけ許可され、その配列は構造体の最後のメンバーでなければなりません。

構造体の中に配列を入れたい - 特定のコンパイル時のサイズを指定する必要があります。特定のコンパイル時のサイズがなければ、ポインターまたはstd::vector.

あなたの例bにはサイズが2あり、サイズがありcます3。同じサイズで構造体を宣言できます

struct STRCT {
  int num;
  string str1, arrStr1[2], str2, arrStr2[3];
};

そして、次のように初期化します

STRCT aStruct[2] = 
{
  {
    a,
    d,
    { b[0], b[1] },
    e,
    { c[0], c[1], c[2] }
  }

  // The rest of the array is value-initialized
};

これは、通常の配列で取得できる範囲です。より柔軟なものが必要な場合は、配列を構造体に直接埋め込むことは、ここでは役に立ちません。必要なメモリ構造を手動で構築するか、std::vector.

于 2012-07-13T06:11:33.797 に答える
0

C++ ではこれは違法です

string arr[2] = {"This","is"};
string arr1[2];

arr1 = arr;

「配列全体を別の配列にコピーする」のようなものはありません。配列要素は個別にコピーする必要があります。

次に、未知のサイズの配列を宣言することはできません

固定サイズの文字列配列を宣言することで構造体宣言を変更し、これを行うことができます

for(int i =0; i< 2; i++)
{

   aStruct[i].num = a;
   aStruct[i].str1= d;

   for(int j=0;j<2;j++)
   {
     arrStr1[i] = b[i];
   }

   aStruct[i].str2= e;

   for(int k=0;k<3;k++)
   {
     arrStr2[i] = c[i];
   }
}

string arrStr1[]string arrStr2[]、の代わりにstd::vectorb[2]c[2]使用することをお勧めします。これは、for ループで条件をハードコーディングするのを避けるのに役立ちます。

于 2012-07-13T05:48:30.150 に答える