Как назначить подкласс для указателя на абстрактный класс в функции? - PullRequest
0 голосов
/ 08 марта 2012
void Player::move(Board &board, Solver &solver){
   Position* best = solver.find_best_move(&board);
   cout<<"Score: "<<best->get_score()<<endl;
   cout<<"Board: ";
   best->get_board()->print_board();
   board = *(best->get_board());
   Board * b(best->get_board());
   cout<<"TEST: ";
   b->print_board();
   board = *b;
  }

Я пытаюсь сделать фактическую ссылку на плату равной новой плате после вызова функции. Board - это абстрактный класс, а get_board () возвращает указатель на Board, но на самом деле это подкласс board, имеющий дополнительный атрибут. Однако после вызова функции перемещения доска остается той же самой, что и до вызова перемещения. Можно ли назначить подкласс указателю на абстрактный суперкласс при изменении фактического значения? Кажется, возникает проблема нарезки.

1 Ответ

0 голосов
/ 08 марта 2012

Я бы использовал указатель Board* вместо ссылки Board&, особенно если учесть подкласс:

void Player::move(Board **board, Solver &solver)
{ 
   Position *best = solver.find_best_move(*board); 
   cout << "Score: " << best->get_score() << endl; 
   *board = best->get_board(); 
   cout << "Board: "; 
   (*board)->print_board(); 
} 

Player p;
Solver solver;
Board *b = ...;
p.move(&b, solver);

Или:

void Player::move(Board* &board, Solver &solver)
{ 
   Position *best = solver.find_best_move(board); 
   cout << "Score: " << best->get_score() << endl; 
   board = best->get_board(); 
   cout << "Board: "; 
   board->print_board(); 
} 

Player p;
Solver solver;
Board *b = ...;
p.move(b, solver);
...