2012-10-05 48 views
3
#include <iostream> 
using namespace std; 

class SomeClass { 
public: 
    bool someArray[4][4]={{0,0,0,0},{0,0,0,0}}; 
}; 

int main() 
{ 
    SomeClass super; 
    super.someArray={{1,1,1,0},{1,0,0,1}}; //This goes red, indicates a mistake. How do i properly fill it? 

    for (int i=0;i<4;i++){ 
     for (int j=0;j<4;j++){ 
      cout<<super.someArray[i][j]; 
     } 
     cout<<endl; 
    } 
return 0; 
} 

请参阅上面代码中的注释。 顺便说一句:super.someArray[4][4]={{1,1,1,0},{1,0,0,1}};也不工作,它可能不应该。无法填充作为类成员的数组。 C++

+0

通过“this goes red”,你是什么意思? –

+0

嗯,我的意思是说,IDE(Qt Creator)指出了一个错误。当我尝试编译它说:从初始化程序列表分配给一个数组。 – user1723614

+0

似乎有第二个错误(其他数组初始化)。如果你注释掉红线表示的代码,代码是否会编译并运行? – nobar

回答

2
  1. 你可能意味着使用bool someArray[2][4](即,与包含有四个布尔元素数组两个元素的数组)。

  2. 你不能在C++中分配一个数组到另一个数组;你需要复制单个元素。即,如:

    super.someArray [0] [0] = 1; super.someArray [0] [1] = 1; super.someArray [0] [2] = 1; super.someArray [0] [3] = 0; super.someArray [1] [0] = 1; super.someArray [1] [1] = 0; super.someArray [1] [2] = 0; super.someArray [1] [3] = 1;

(如果你有一些来源为您的数据,你可以使用过程中的循环。)

+0

即使他不具有所述数据的源时,他可以创建一个(一个本地阵列),从而使代码更具有可读性。 –

+0

@ BenjaminLindley同意。当然,someArray变量可能应该在构造函数中进行初始化。 –

+0

您可以在C或C++中使用初始化,但它必须是声明的一部分。 int myarray [3] [3] = {{1,2,3},{4,5,6},{7,8,9}};例如,它是有效的。 – engineerC

1

以下工作我使用GNU编译器。请注意,我用std :: tr1 :: array替换了原始数组。这个类在分配整个数组方面更灵活(而不仅仅是从文本初始化数组)。

#include <iostream> 
#include <tr1/array> 
using namespace std; 
using namespace tr1; 
typedef array<array<bool,4>,4> array4x4; 

class SomeClass { 
public: 
    array4x4 someArray; 
    SomeClass() : someArray((array4x4){{{{0,0,0,0}},{{0,0,0,0}}}}) {} 
}; 

int main() 
{ 
    SomeClass super; 
    super.someArray=(array4x4){{{{1,1,1,0}},{{1,0,0,1}}}}; //Now works 

    for (int i=0;i<4;i++){ 
     for (int j=0;j<4;j++){ 
      cout<<super.someArray[i][j]; 
     } 
     cout<<endl; 
    } 
return 0; 
} 

但是,下面的方法是有点接近你开始的地方,并演示了一些在其他意见建议的东西...

#include <iostream> 
#include <algorithm> 
using namespace std; 

class SomeClass { 
public: 
    bool someArray[4][4]; 
    SomeClass() 
     { 
     bool temp[4][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; 
     for (int j=0; j<4; j++) for (int i=0; i<4; i++) someArray[j][i] = temp[j][i]; 
     } 
}; 

int main() 
{ 
    SomeClass super; 
     bool temp[4][4] = {{1,1,1,0},{1,0,0,1}}; // a local source of data 
     for (int j=0; j<4; j++) for (int i=0; i<4; i++) super.someArray[j][i] = temp[j][i]; 

    for (int i=0;i<4;i++){ 
     for (int j=0;j<4;j++){ 
      cout<<super.someArray[i][j]; 
     } 
     cout<<endl; 
    } 
return 0; 
} 
+0

此外,请注意用于初始化std :: tr1 :: array的双括号{{}}。我不知道这是叫什么,但它似乎是必需的,以便进行这种初始化(至少在某些编译器中)。我也不知道这个语法是否符合标准。 – nobar

+0

由新的标准,不需要双包围。只有不符合要求的编译器才需要它。 – Dani

+0

第二种方法是符合标准的,易于理解,但我认为这是相当多的错误倾向。有多个地方可能会通过使用数组大小​​的错误值来使程序崩溃。 – nobar

1
super.someArray[4][4]={{1,1,1,0},{1,0,0,1}}; 

上面的线只需要是:

super.someArray[4][4]={1,1,1,0,1,0,0,1}; 

释: 它会自动进入数组的下一部分。如果你认为它是一张表,一旦第一行被填满,它将开始为下一行声明它。

所以,如果你写:

super.someArray[4][4]={1,1,1,1,1}; 

它会设置:

someArray[0][0] 
someArray[0][1] 
someArray[0][2] 
someArray[0][3] 
someArray[1][0] 

都等于1

(我可能具有数字切换所以它可能是x和y地方改变了,我无法回想起C++)

+0

呃......它也给出了一个错误。 – user1723614