2015-04-25 3 views
-1

Мой конструктор почему-то игнорируется. Вот мой код:Конструктор игнорируется

Моего класса:

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();*/ 
}; 

Поле конструктора() должны инициализировать поле моих 4 побед с «о, и если я хочу, чтобы добавить плитки она будет й знаком, где плитка. Но если я

int main() 
{ 
    char x; 

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

    return 0; 
} 

Конструктор будет игнорируются, и я получаю weired знак, который, скорее всего, только в настоящее время, где я смотрю. Позиционирование работает, потому что, если я сначала установил и x (3,2), он напечатает мне x.

Любые идеи?

+3

[* предупреждение: не используется переменная 'Playfield' *] (http://coliru.stacked-crooked.com/a/f8f91ad81e315d48) – chris

+1

'символ Playfield [5] [5]' в ваш конструктор делает _new_ variable 'PlayField', который затеняет член класса. –

+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 из std::vector или std::array из std::array вместо этого. Только вниз сторона использования std::array по сравнению с char[5][5] является то, что размеры (5x5 в вашем случае) должны быть известны во время компиляции (так же, как в вашем примере)

#include <iostream> 
#include <array> 
#include <vector> 

using namespace std; 

int main() { 
    char o='A'; 

    // C++11 or later: 
    std::array<std::array<char,5>, 5> PlayField2{{{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}}}; 

    // or: (C++11 or later) 
    std::array<std::array<char,5>, 5> PlayField; 
    for(auto& row : PlayField){ 
     for(auto& place : row){ 
      place=o; 
     } 
    } 
    cout << PlayField[2][3] << std::endl; 

    // or: (C++98 or later) 

    std::vector<std::vector<char>> PlayFieldVec(5,std::vector<char>(5,o)); 
    cout << PlayFieldVec[2][3] << std::endl; 

} 

синтаксис, который используется для инициализации массива отлично, просто убедитесь, что вы не назначаете переменную new, если вы хотите инициировать существующую.

+0

А я вижу, спасибо вам, чужой! –

+0

Ваш первый пример: Не вся поддержка компилятора (пока). VS2013 не совместим с C++ 14. LLVM выводит предупреждение о том, что o используется до инициализации в качестве o, определенного после PlayField (что не должно быть таким, каким оно является атрибутом, может быть, ошибкой?) –

+0

@MartinSchlott, Спасибо. Я добавил комментарии о том, какая версия поддерживает какое решение. Насколько я знаю, также в C++ 14, члены всегда инициализируются в порядке объявления, поэтому я перешел на o до PlayField. –

0

Вы не можете присвоить значение массиву, подобному этому. Вы определяете локальную переменную в своем конструкторе. Вы можете сделать это в своем конструкторе.

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

О, и у вас есть намек на то, как я могу это сделать? –

+0

@ Yíu Я обновил свой ответ –

+0

Спасибо, теперь я знаю, что вы имеете в виду! Знаете ли вы, почему это так? Поскольку я прихожу из c и там это было возможно. –

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(int x=0;x<5;x++) 
    for(int y=0;y<5;y++) 
    PlayField[x][y]=o; 

В конце концов, ваш конструктор не был проигнорирован, он не имеет эффекта вы хотели :-)

+0

Это уже было сказано в первом ответе: «Вы определяете локальную переменную в своем конструкторе». –

+0

@JohanLundberg не в ответах, которые я видел до тех пор, пока я начал. Во время записи я перекрестно проверил его с VS2013, если есть способ C++ 11, который работает с текущим компилятором. Это требует времени. –

+0

Спасибо, что приняли время, я очень ценю. –

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

Спасибо за ваш ответ и время. –

+0

Тому, кто отменил этот ответ, делает это без объяснения плохой формы. – Peter

+0

Упрощенный, казалось, что-то вроде работы. –

Смежные вопросы