массив строк внутри объекта

0

У меня возникла проблема с созданием массива строк внутри объекта. Я не знаю, как его исправлять, поэтому я прошу помощи. Здесь кроется проблема:

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;
};
  • 4
    Вам нужен std::string **sTab; , Но, пожалуйста, используйте векторы или другие контейнеры вместо указателей на указатели.
Теги:
string
object
arrays

1 ответ

1

Вам нужно квалифицировать имена из стандартной библиотеки:

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.

  • 0
    Вы были очень полезны, но я не совсем понимаю, что такое «вектор». Не могли бы вы посмотреть на мое редактирование? Моя дальнейшая проблема может быть связана с этим, может быть, вы дадите мне несколько советов :)
  • 0
    @ArkadiuszGaller: не добавлять using namespace std; , Я предполагаю, что ваша новая проблема заключается в том, что вы неправильно инициализировали sTab для указания на действительную память - возможно, потому что копировальный конструктор chess ужасно сломан. vector - это класс из стандартной библиотеки, который управляет динамическим массивом, поэтому вам не нужно писать подверженный ошибкам код, подобный этому. Ваша вводная книга должна объяснить, как ее использовать.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню