2016-09-16 8 views
1

Использование C++ 11, я изначально был 2d вектор следующей формы со значениями по умолчанию:C++ Instantiate 2D вектор внутри Struct со значениями по умолчанию

vector<vector<int>> upper({{1,2,3,4,5,6},{7,8,9,10,11,-1},{12,13,14,15,-1,-1},{16,17,18,-1,-1,-1},{19,20,-1,-1,-1,-1},{21,-1,-1,-1,-1,-1}}); 
vector<vector<int>> lower({{0,0,0,0,0,0},{0,0,0,0,0,-1},{0,0,0,0,-1,-1},{0,0,0,-1,-1,-1},{0,0,-1,-1,-1,-1},{0,-1,-1,-1,-1,-1}}); 

Это представляет верхний и нижний компонент головоломки я Я пытаюсь решить. Теперь я хочу изменить мою программу таким образом, чтобы эти векторы были объявлены внутри структуры, но я не уверен, как это сделать и даю значениям вектора по умолчанию 2d. Это то, что я имею на данный момент:

struct BoardState{ 
vector<int> row; 
vector<vector<int>> upper; 
vector<vector<int>> lower; 

BoardState() : row(6,0), upper(6,row), lower(6,row) {}; 
}; 

Но это вызывает ошибку сегм, когда я пытаюсь получить доступ, что внутри, с помощью:

#include <iostream> 
#include <vector> 
#include <stdlib.h> 

BoardState *board; 
int main(){ 
      using namespace std; 
      ... 
      for(int i=0; i<6; i++){ 
       for(int j=0; j<6; j++){ 
        cout << board->upper[i][j] << " "; 
       } 
       cout << endl; 
      } 

} 

Как дать значения по умолчанию для 2d вектора внутри структура? Благодарю.

+0

Возможный дубликат [gcc warning "будет инициализирован после '] (http://stackoverflow.com/questions/1564937/gcc-warning-will-be-initialized-after) – ArchbishopOfBanterbury

ответ

0

Я не знаю, как это сделать, и дать 2d векторов значения по умолчанию.

Точно так, как за пределами структуры

#include <vector> 
#include <iostream> 

struct BoardState 
{ 
    std::vector<std::vector<int>> upper{{1,2,3,4,5,6},{7,8,9,10,11,-1}, 
             {12,13,14,15,-1,-1},{16,17,18,-1,-1,-1}, 
             {19,20,-1,-1,-1,-1},{21,-1,-1,-1,-1,-1}}; 
    std::vector<std::vector<int>> lower{{0,0,0,0,0,0},{0,0,0,0,0,-1}, 
             {0,0,0,0,-1,-1},{0,0,0,-1,-1,-1}, 
             {0,0,-1,-1,-1,-1},{0,-1,-1,-1,-1,-1}}; 
    std::vector<int> row; 

    BoardState() 
    { } 
}; 

int main() 
{ 
    BoardState bs; 

    std::cout << bs.upper[3][1] << std::endl; // print 17 
} 

или

struct BoardState 
{ 
    std::vector<int> row {6, 0}; 
    std::vector<std::vector<int>> upper {6, row}; 
    std::vector<std::vector<int>> lower {6, row}; 

    BoardState() 
    { } 
}; 

(в данном случае, печать 0).

Подтвердите, что, как объяснено ArchbishopOfBanterbury и Petter, члены инициализируются в том порядке, в котором они объявлены; поэтому, если вы хотите инициализировать upper и lower с использованием row, вам необходимо объявить row.

1

gcc warning" 'will be initialized after' От:

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

EDIT:

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

struct BoardState{ 
vector<int> row; 
vector<vector<int>> upper; 
vector<vector<int>> lower; 
BoardState() : row(6,0), upper(6,row), lower(6,row) {}; 
}; 

int main() { 
    BoardState board; 
    for(int i=0; i<6; i++){ 
     for(int j=0; j<6; j++){ 
      cout << board.upper[i][j] << " "; 
     } 
     cout << endl; 
    } 
} 
+0

Спасибо. Я исправил эту проблему но я все еще получаю ошибку seg. – MetalMagnum

+0

Попробуйте код в моем редактировании - он работает. – Petter