构造函数被忽略了

时间:2015-04-25 18:56:14

标签: c++ constructor

我的构造函数会以某种方式被忽略。这是我的代码:

我的课程:

class field
{
private:
    char PlayField[5][5];

public:
    char o = 'o';
    field()
    {
        char PlayField[5][5] = { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } };
    }


    void setTile(int x_val, int y_val)
    {
        PlayField[x_val][y_val] = 'x';
    }
    char getTile(int x_val, int y_val)
    {
        return PlayField[x_val][y_val]; 
    }



    /*field::~field();*/
};

构造函数field()应该使用'o'将我的4胜利字段初始化,如果我想添加一个Tile,它将标记该tile的位置。 但是如果我做的话

int main()
{
    char x;

    field FourWins;
    //FourWins.setTile(3, 2);
    x = FourWins.getTile(3, 2);
    std::cout <<  x << std::endl;

    return 0;
}

构造函数将被忽略,我得到一个标志,这很可能只是目前在我正在寻找的地方。 位置查找工作,因为如果我第一次设置和x到(3,2)它将打印我x。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

Ideone example here

您使用的char[][]的初始化语法是允许的,但仅限于构造 - 而不是赋值(并且您的示例构造一个新变量而不是已分配成员变量)。至少用C ++ 14你可以这样做:

class field
{
private:
    char o = 'o';
    char PlayField[5][5];
public:
    field() : PlayField{{ o, o, o, o, o }, { o, o, o, o, o }, 
                        { o, o, o, o, o }, { o, o, o, o, o }, 
                        { o, o, o, o, o }}
    {}
};

请考虑使用std::vector的{​​{1}}或std::vector的{​​{1}}。与std::array相比,使用std::array的唯一不利方面是,在编译时必须知道大小(在您的情况下是5x5)(就像在您的示例中一样)

std::array

您用于数组初始化的语法很好,只要确保不指定 new 变量(如果您要启动现有变量)。

答案 1 :(得分:1)

您所犯的错误是,您定义了PlayField两次:

class field
{
private:
    char PlayField[5][5];
         ^^^^^^^^  class attribute

public:
    char o = 'o';
    field()
    {
        char PlayField[5][5] = { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } };
        ^^^^ this 'char' made a second PlayField local! a common mistake
    }

因此,它只初始化本地数组,而不是类属性。

不幸的是 - 据我所知 - 除了使用两个for循环之外,没有办法显式初始化一个数组:

for(int x=0;x<5;x++)
  for(int y=0;y<5;y++)
   PlayField[x][y]=o;

最后,你的构造函数没有被忽略,它没有你想要的效果: - )

答案 2 :(得分:0)

您无法像这样为数组赋值。您正在构造函数中定义局部变量。您可以在构造函数中执行此操作。

for(int i = 0; i < 5; i++){
    for (int j = 0; j < 5; ++j) {
        PlayField[i][j] = o;
    }
}

答案 3 :(得分:0)

正在调用构造函数,但未初始化CharField成员。相反,它正在创建一个名为CharField的本地数组(虽然名称相同,但与名为CharField的结构成员不同),初始化它,并且当构造函数完成时该数组不再存在。

构造函数实现

field()
    {
        char PlayField[5][5] = { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } };
    }

具有完全相同的效果(不会将名为CharField的结构成员更改)
field()
    {
        char unused_data[5][5] = { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } };
    }

唯一改变的是在构造函数体中创建的临时数组的名称。

要实际初始化PlayField成员,请更改此构造以使用初始化列表

 field() : PlayField { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } }
    {  // body of constructor is here
    };

或(在C ++ 11之前),不支持此表单。

field()
    {
        for (int i = 0; i < 5; ++i)
           for (int j = 0; j < 5; ++j)
                CharField[5][5] = o;
    };