2015-10-23 8 views
0

Я разрабатываю шахматную игру (новичок C++), однако я застрял в процессе проверки отдельных типов штук, например, пешка перемещается только по одному пробелу за раз, за ​​исключением первого время перемещения 2 пробела и т. д.Вызов методов подкласса из объекта суперкласса, виртуальных функций

У меня есть кусок класс и подкласс, который является пешкой, король, и т.д., который содержит метод:

check(string position,string destination); 

и возвращают логическое значение, возможно ли, чтобы перейти к пункту назначения.

У меня есть указатель на каждый кусок, который я определил, выполнив:

pawn pawnPieces[16]; 
piece *pointer[16]; 

for (i=0;i<16;i++) 
{ 
    pointer[i]=&pawnPieces[i]; 
} 

После моей первоначальной проверки, я хочу, чтобы вызвать функцию проверки выше от основной, как тест:

cout << pointer[1]->check("B1","C1") << endl; 

Это дает мне ошибку «ни один член не назван« проверять »в куске», что имеет смысл, однако я уверен, что был бы способ связать класс штук с пешкой, королем и т. Д.

Я думаю, что я нужно что-то делать с виртуальными функциями из того, что я прочитал, но я не уверен, как подойти к этому. Если бы кто-нибудь мог предложить несколько указателей, которые были бы высоко оценены.

Этот подход при попытке вызвать функцию подкласса из указателя на класс выше может быть принципиально ошибочным, возможно, мне нужно изменить свой проект для достижения этой цели? Я все еще хочу сохранить метод проверки класса пешки в том же положении, поскольку я считаю, что он инкапсулирует его хорошо.

EDIT: Я сделал чистую виртуальную функцию в классе штучного:

virtual bool check(string positionIN,string destination)=0; 

Теперь, когда я называю соиЬ линию выше, я получаю ошибку сегментации, и я не уверен, почему. Я предполагаю, что это потому, что я использую указатели?

EDIT2: Спасибо за это! Я реализовал это, однако я получил небольшую ошибку, является виртуальным, чтобы быть привязанным к пешке и классу короля? По моему мнению, я думал, что виртуальный тег идет только на базовый класс.

EDIT3: Я понимаю, я пометил функцию проверки в классах пешки и короля с помощью виртуального тега и скомпилировал его.

Теперь я получаю ошибку сегментации с помощью вызова самого

pawnPieces[1].check("B1","C1") 

объекта и вызова указатель на объект

pointer[1]->check("B1","C1") 

от основной, и я не знаю, почему.

EDIT4: Все работает сейчас, я звонил из основного теста, однако, когда я его вызывал из моей программы, все работало, спасибо всем!

+1

Ну, найдите _interfaces_ и 'virtual', pure' virtual' соответственно. –

+0

Виртуальные/чистые методы - это, безусловно, путь. Объявите 'check()' in 'piece' и переопределите его в' pawn', 'king' и т. Д. Если у вас все еще есть проблемы, пожалуйста, покажите свой фактический код. –

+0

Редактировать 2: Он только * нуждается в *, чтобы быть в базовом классе, но я бы предпочел использовать его во всех из них (а также 'override'), чтобы сделать его более очевидным. – immibis

ответ

2

Что вы пытаетесь сделать, это именно то, для чего предназначены методы virtual.

class piece 
{ 
public: 
    virtual bool check(string position, string destination) = 0; 
}; 

class pawn : public piece 
{ 
public: 
    virtual bool check(string position, string destination) 
    { 
     return ...; 
    } 
}; 

class king : public piece 
{ 
public: 
    virtual bool check(string position, string destination) 
    { 
     return ...; 
    } 
}; 
+0

Большое вам спасибо, я начинаю куда-то! –

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