Объявление переменной как типа данных «Класс», без вызова конструктора «Класс»? - PullRequest
3 голосов
/ 31 января 2010

Простите, если я просто что-то упустил, но я пытаюсь перейти от структур и c к классам и c ++.

Вот что я пытаюсь сделать:

A имеет класс "Шашки" и класс "Доска".

Теперь со структурами я могу просто создать массив Checkers в моем файле "board.cpp", выполнив:

Checker checkers[2][12]

(0 и 1 для каждой стороны, 0-11 для каждой фигуры)

Проблема в том, что с классами, делающими одно и то же объявление, будет пытаться вызвать конструктор "Checkers". Я получаю эту ошибку: «ошибка: нет соответствующей функции для вызова‘ Checker :: Checker () ’»

Мой конструктор Checker имеет дело с инициализацией отдельной части (например, если она на стороне 0 или 1, часть 0-11), поэтому я не хотел вызывать ее там.

Есть ли способ избежать этого или я поступаю неправильно? Благодаря.

РЕДАКТИРОВАТЬ: Или, может быть, я должен просто спроектировать конструктор для инициализации массива шашек? Можете ли вы даже объявить переменные как тип данных класса / объекта?

Ответы [ 5 ]

5 голосов
/ 31 января 2010

Вы можете создать конструктор по умолчанию или иметь массив Checker указателей и инициализировать их путем динамического выделения каждого Checker в конструкторе Board с соответствующими параметрами. В последнем случае конструктор не вызывается до тех пор, пока вы его не выделите.

2 голосов
/ 31 января 2010

Создать конструктор по умолчанию. Затем используйте начальную функцию. Я рекомендую вам использовать вектор STL.

1 голос
/ 31 января 2010

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

Зачем вам нужно знать, какой именно чекер? Если игрок вышел из комнаты, и кто-то поменял его шашки, заметит ли он?

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

enum Side { White, Black };

class Checker
{
    Side side ;
public:
    Checker ( Side side ) : side(side) {
    }
};


int main()
{
    Checker white[12] = { White, White, White, White, White, White, White, White, White, White, White, White, };
    Checker black[12] = { Black, Black, Black, Black, Black, Black, Black, Black, Black, Black, Black, Black, };
    Checker* both[2] = { white, black };

    return 0;
}

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

    Checker white[12] = { Checker(White,0), Checker(White,1) ...

Но я бы, как правило, просто добавил шашки на доску, используя вместо этого несколько объектов-шашек, представляющих Белую, Черную, Белую Королеву и Черную Королеву, если только нет очень веской причины для отслеживания личности.

1 голос
/ 31 января 2010

Проблема в том, что с классами, делающими одно и то же объявление, будет пытаться вызвать конструктор "Checkers". Я получаю эту ошибку: «ошибка: нет соответствующей функции для вызова‘ Checker :: Checker () ’»

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

Вместо использования двумерного массива используйте вектор векторов.

std::vector<std::vector<Checker> > checkers;
0 голосов
/ 31 января 2010

Чтобы ответить на этот вопрос, мне действительно нужно увидеть определение класса «Checker». Вот предположение, хотя ...

Я думаю, что ваш класс Checker определяет конструкторы не по умолчанию, но не имеет конструктора по умолчанию. По умолчанию существует конструктор по умолчанию IYSWIM, но как только вы определяете какой-либо конструктор для себя, предоставляемый компилятором неявный конструктор по умолчанию отключается.

Если у вас есть ...

class Checker
{
  public:
    Checker (int p)  {  ...  };
};

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

Checker checkers[2][12];

Вместо этого попробуйте ...

class Checker
{
  public:
    Checker ()  {  ...  };
    Checker (int p)  {  ...  };
};

Что касается совета по использованию std :: vector, в этом случае я не согласен. Массив имеет фиксированный размер, поэтому использование std :: vector бесполезно - только дополнительная сложность и другие затраты.

Держите ваш массив в стиле C, но сделайте его закрытым (или, по крайней мере, защищенным) внутри класса "Board" - мой совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...