関数内の抽象クラスポインタにサブクラスを割り当てる方法?
-
09-12-2019 - |
質問
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;
}
.
関数を呼び出した後、実際のボード参照を新しいボードに等しくしようとしています。ボードは抽象クラスで、get_board()はボードへのポインタを返しますが、実際には追加の属性を持つボードのサブクラスです。ただし、移動機能が呼び出された後、ボードは移動する呼び出し前の同じボードです。実際の値を変更しながら、サブクラスを抽象スーパークラスへのポインタに割り当てることは可能ですか?スライスの問題は発生しているようです。
解決
私は、特にサブクラスが関与しているため、一般的な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);
. 所属していません StackOverflow