2014-11-04 1 views
-1

У меня есть класс под названием magicSquare с конструктором и функцией отображения, называемой дисплеем. Конструктор создает магический квадрат, а функция отображения отображает результаты. В моей основной функции я создал экземпляр magicSquare под названием ms и дал ему значение 7. Чтобы отобразить его, не следует ли это работать, если я просто сделал ms.display()?Как правильно реализовать функцию отображения класса?

class magicSquare 
{ 
private: 

int size, square; 
vector<vector <int> > finalvec; 

public: 

magicSquare(int a):finalvec(a, std::vector<int>(a)) 
{ 
    int i = 0; 
    int j = a/2; 

    size = a; 
    square = a * a; 

    vector<int>vec(a); 
    vector<vector<int> > finalvec(a,vec); 

    for (int i = 0; i < size; i++) 
    { 
     for (int j = 0; j< size; j++) 
      cout << finalvec[i][j]; 
      cout << endl; 
    } 

    for (int k=0; k < square; ++k) 
    { 
     finalvec[i][j] = k; 
     i--; 
     j++; 

     if (k%a == 0) 
     { 
      i = i+ 2; 
      --j; 
     } 
     else 
     { 
      if (j==a) 
       j = j- a; 
      else if (i<0) 
       i = i+ a; 
     } 
    } 

} 

void display() 
{ 
    for (int i = 0; i < size; i++) 
    { 
      for (int j = 0; j< size; j++) 
       cout << finalvec[i][j]; 
       cout << endl; 

    } 
} 
}; 


int main() 
{ 
    magicSquare ms(3); 
    ms.display(); 
    return 0; 
} 
+2

Правильно отступов код поможет вам найти хотя бы одну ошибку. После этого напишите полный, компилируемый код. –

+1

'finalvec' в функции magicSquare скрывает переменную-член' finalvec'. –

ответ

-1

Ваша ошибка

Как указано на @Retired Ниндзя, вектор> finalvec (а, VEC); скрыть свой член переменной finalvec, как вы переопределить его как новый вектор ...

Что может исправить это

Вы можете построить свой вектор внутри Member initializer list как этот

magicSquare(int a) : finalvec(a, std::vector<int>(a, 0)) { 
/* your constructor */ 
} 

И удалить два линия:

vector<int>vec(a); 
vector<vector<int> > finalvec(a,vec); 

В коде

Как т о не сделать эту ошибку

видя, значение которого является членом класса, параметром метода или даже переменный контекста может быть когда-то сложно:

Что я могу рекомендовать вам это сделать следующее:

class member  -> m_NAME_OF_YOUR_CLASS_MEMBER 
method parameter -> t_NAME_OF_YOUR_METHODE_PARAMETER 
context variable -> c_NAME_OF_YOUR_CONTEXT_VARIABLE 

сделав эту ошибку, как вы это сделали, сделать немного сложнее!

EDIT: После тестирования код

Я вижу, что есть ошибка в нем, по сути, первый раз, когда вы идете в этой строке:

finalvec[i][j] = k; 

я> размер, поэтому доступ далее, что ваш вектор разрешите это, что приведет к segfault! пожалуйста, восстановите свой код!

надежда, что может помочь

+3

Это только инициализирует внешний вектор размером, а не векторами внутри него. Вам понадобится 'finalvec (a, std :: vector (a))', чтобы сделать как внешний, так и внутренний векторы того же размера. –

+0

Я добавил magicSquare (int a): finalvec (a, std :: vector (a)), и моя программа выводит числа, но неверные. – user3598181

+0

@Retired Ninja это моя ошибка! ima собирается редактировать! – CollioTV

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