У меня возникла проблема с созданием массива строк внутри объекта. Я не знаю, как его исправлять, поэтому я прошу помощи. Здесь кроется проблема:
main.h:
#pragma once
#include <iostream>
#include <conio.h>
#include <string>
class tab2D {
protected:
int width;
int height;
string **sTab;
int **iTab;
public:
tab2D();
tab2D(int x, int y, char c);
~tab2D();
tab2D(tab2D&t);
};
class chess: public tab2D {
public:
chess(int x, int y);
~chess();
chess(chess&c);
void init();
bool ifMove();
void show();
};
class matrix: public tab2D {
public:
matrix(int x, int y);
~matrix();
matrix(matrix&m);
};
Компилятор говорит: синтаксическая ошибка: missing ';' перед '*' о линии
string **sTab;
Я предполагаю, что я не могу сделать динамический массив строк, и это создает дополнительные проблемы с обработкой этого массива. Можете ли вы мне помочь? :)
* ОБНОВЛЕНИЕ 1 * Спасибо, я забыл добавить строку
using namespace std;
Теперь это работает, но у меня другая проблема.
#include "main.h"
using namespace std;
////// Konstruktor, konstruktor kopiujący oraz destruktor //////
chess::chess(int x = 8, int y = 8) : tab2D(x, y, 'c') {
init();
};
chess::chess(chess&c) {
chess(c.width, c.height);
};
chess::~chess() {
};
////// Metody //////
////// Uzupełnianie kolorów pól oraz rozstawianie figur i pionków //////
void chess::init() {
/// kolory pól: 0 - biały, 1 - czarny///
int last = 0;
for(int i = 0; i < this->height; ++i) {
for(int j=0; j < this->width; ++j) {
if(last = 0) {
this->sTab[i][j] = "1";
last = 1;
}
else if(last = 1) {
this->sTab[i][j] = "0";
last = 0;
}
}
if(last = 0)
last = 1;
else if(last = 1)
last = 0;
};
/// rozstawienie pionków ///
for(int i = 0; i < this->width; ++i) {
sTab[1][i] = sTab[1][i] + "0";
sTab[6][i] = sTab[6][i] + "a";
};
};
////// Wyświetlenie szachownicy //////
void chess::show() {
for(int i = 0; i < (this->height + 1); ++i) {
for(int j=0; j < (this->width + 1); ++j) {
if(i == 0 && j == 0)
cout << " ";
else if (i != 0 && j == 0) {
switch (i) {
case 1:
cout << "A ";
break;
case 2:
cout << "B ";
break;
case 3:
cout << "C ";
break;
case 4:
cout << "D ";
break;
case 5:
cout << "E ";
break;
case 6:
cout << "F ";
break;
case 7:
cout << "G ";
break;
case 8:
cout << "H ";
break;
default:
break;
}
}
else if (i == 0 && j != 0) {
cout << j << " ";
}
else {
cout << this->sTab[i-1][j-1] << " ";
}
}
cout << endl;
};
};
Когда я запускаю программу, в строке есть точка останова
this->sTab[i][j] = "0";
Я предполагаю, что что-то не так с созданием массива строк, но я не понимаю, почему именно точка останова и не может ее отлаживать.
UPDATE 2 Вот код для tab.cpp:
#include "main.h"
using namespace std;
////// Konstruktor domyślny, konstruktor, konstruktor kopiujący oraz destruktor //////
tab2D::tab2D() {
};
tab2D::tab2D(int x, int y, char c) {
this->width = x;
this->height = y;
if (c == 'm') {
this->iTab = new int*[this->width];
for(int i=0;i<this->height;++i)
this->iTab[i] = new int[this->width];
}
else if (c == 'c') {
this->sTab = new string*[this->width];
for(int i=0;i<this->height;++i)
this->sTab[i] = new string[this->width];
}
else {
}
};
tab2D::tab2D(tab2D&t) {
tab2D(t.width, t.height, 't');
};
tab2D::~tab2D() {
for(int i=0;i<height;++i)
delete [] iTab[i];
delete [] iTab;
for(int i=0;i<height;++i)
delete [] sTab[i];
delete [] sTab;
};
Вам нужно квалифицировать имена из стандартной библиотеки:
std::string **sTab;
^^^^^
Если вы делаете то, что, как я думаю, вы делаете, и выделяете вещи new
, тогда вам стоит подумать об использовании std::vector
для решения проблем, связанных с проблемами управления памятью, с которыми вы собираетесь столкнуться. Если вы действительно хотите сами поиграть с указателями, не забывайте о Правиле трех.
ОБНОВЛЕНИЕ Ваша новая проблема может быть вызвана тем, что конструктор копирования ужасно нарушен:
chess::chess(chess&c) {
chess(c.width, c.height);
};
Это создает и уничтожает временный объект, но не инициализирует построенный объект, оставляя его в недопустимом состоянии. Вероятно, вы вообще не хотите объявлять конструктор-копию, если базовый класс правильно копируется. Если вам это нужно, это должно быть больше похоже:
chess::chess(chess const & c) : // 'const' so constant objects can be copied
tab2D(c) // copy the base-class subobject
{
// do whatever else needs doing
}
В качестве альтернативы, новая проблема может быть связана с ошибками в tab2D
которые вы нам не показали. Лучший способ отследить это - это выполнить программу с помощью отладчика, проверяя, что все правильно инициализировано перед использованием.
ОБНОВЛЕНИЕ Вероятно, ошибка времени выполнения вызвана распределением неправильного числа указателей. Вы хотите
iTab = new int*[height]; // Not width
а также для sTab
.
using namespace std;
, Я предполагаю, что ваша новая проблема заключается в том, что вы неправильно инициализировали sTab
для указания на действительную память - возможно, потому что копировальный конструктор chess
ужасно сломан. vector
- это класс из стандартной библиотеки, который управляет динамическим массивом, поэтому вам не нужно писать подверженный ошибкам код, подобный этому. Ваша вводная книга должна объяснить, как ее использовать.
std::string **sTab;
, Но, пожалуйста, используйте векторы или другие контейнеры вместо указателей на указатели.