在数组中一次性分配整个结构 我正在学习C++,我遇到了一个问题:结构>代码>数组。我的结构是: struct board { string name; string desc; int nval; int sval; int eval; int wval; };

在数组中一次性分配整个结构 我正在学习C++,我遇到了一个问题:结构>代码>数组。我的结构是: struct board { string name; string desc; int nval; int sval; int eval; int wval; };,c++,arrays,struct,C++,Arrays,Struct,我的数组如下所示: board field[10][10]; field[5][6] = {"ExampleName", "This is an example", 3, 4, 5, 6}; //so I don't have to type everything over and over again... 例如,我能够做到: field[5][6].name = "ExampleName"; field[5][6].desc = "This is an example"; field[5

我的数组如下所示:

board field[10][10];
field[5][6] = {"ExampleName", "This is an example", 3, 4, 5, 6};
//so I don't have to type everything over and over again...
例如,我能够做到:

field[5][6].name = "ExampleName";
field[5][6].desc = "This is an example";
field[5][6].nval = 3;
//and so on...
但我想立即分配给整个结构,如下所示:

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

恐怕你不能这样做

但在现实生活中,这不是问题,因为您通常不需要手动填充此类字段。你通常是循环进行的

如果您不介意运行时初始化,我会这样做:

    // 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
    }

}

正如已经提到的,C99以及C语言支持这种语法的形式,但是标准C++没有。可以通过在结构中添加构造函数来实现。请注意,这将不再与ANSI C兼容

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;
    }
};

字段[1][2]=板(“名称”、“描述”,1、2、3、4)

如果您定义了使用参数的构造函数,您将能够创建临时元素并使用它初始化给定元素。您还需要定义和默认构造函数:

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;
}

如果您确实需要为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>
提取数字


但还是很痛苦。您确定没有自动生成至少大多数值的方法吗?

在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;
}
结构板 { 字符串名; 字符串描述; 国际nval; 国际斯瓦尔; 综合评价; int-wval; }字段[10][10]; int main() { 字段[5][6]={“ExampleName”,“这是一个示例”,3,4,5,6};
cout问题不太清楚,因为你的一句话是什么意思,所以我将开始提供建议:

使用聚合初始化:

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++(在所有的变体中,假定<代码>板<代码>是一个集合,因此<代码>板[10 ] [10 ] < /C>也是一个集合,但是它很难读取。 下一步是更接近您正在做的事情,即初始化每个元素(而不是数组),在C++11中,您可以使用建议的相同类型的初始化(注意,这将更改类型的属性,并且需要为数组创建默认构造函数):

或通过函数:

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

请注意,在这两种情况下,数组中的元素都是在数组初始化期间初始化的,然后在其上复制一个新对象。

C99具有允许这种情况的复合文字(排序),但我不知道它是否在C++11中变成了C++,括号初始化对单个
以及阵列都有效。好的,我不能像你们写的那样快速阅读和尝试解决方案,所以非常感谢你们所有人!我真的很喜欢这个网站,但我从没想过我在半小时内得到这么多答案。我想他的意思是简单地分配类似于初始化的静态数据。在C99中可以使用复合文本。不幸的是,在我的情况下,我必须手动填写。但是感谢您的快速回答!这是正确的,但在实际运行之前,您不能完全调用构造函数:)“斯卡莱马兰思,这是什么意思?”这不是我所关心的ASK所希望的。这只是用最新的C++标准支持的。谢谢你的答案,但是你和拨号器之间的区别是什么呢?或者我应该用哪一个?我在默认的C-Tor中定义明确的默认值,通过引用传递参数。通过初始值设定项列表初始化和初始化成员(这比在构造函数主体中为其赋值更有效)。