【问题标题】:Can't override method C++ [duplicate]无法覆盖方法 C++ [重复]
【发布时间】:2021-12-02 08:11:34
【问题描述】:

我正在解决 8 个皇后拼图(在棋盘上放置 8 个皇后而不会发生冲突)并创建了一个类 Square。现在我认为这个类应该是2个子类QueenEmpty的父亲。

还有一个类:Chessboard,它包含一个双向数组,我想要的是在打印时我将有 8 个Q(Queens)和 56 个E(空见代码)。

这些是类(我不会全部写出来):

class Square{
    int x;
    int y;
public :
Square() {};
Square(int ,int);
bool isAvaible();
void swapStatus();
virtual void printValue();
void setCoord(int,int);
int getX();
int getY();
};
void Square::printValue(){
    std::cout << "S ";
};

#include "square.hpp"

class Queen : public Square{
public:
    ...
    virtual void printValue();
    ...
};
void Queen::printValue(){
    std::cout << "Q ";
}

#include "Square.hpp"

class Empty : Square {
public:
    ...
    virtual void printValue();
    ...
};
void Empty::printValue(){
    std::cout << "E ";
}

一开始Chessboard中的所有元素都是Square,当添加一个女王时,Square必须被Queen替换。 我就是这样做的:

...
std::vector<std::vector<Square> > squares;
...

void Chessboard::setQueen(int x, int y){
    squares[x][y]=Queen(x,y);
}

我使用这种方法在棋盘上设置 8 个皇后,当打印所有方格时,这是输出:

S S S S S S S S 
S S S S S S S S 
S S S S S S S S 
S S S S S S S S 
S S S S S S S S 
S S S S S S S S 
S S S S S S S S 
S S S S S S S S 

而不是:

Q S S S S S S S 
S Q S S S S S S 
S S Q S S S S S 
S S S Q S S S S 
S S S S Q S S S 
S S S S S Q S S 
S S S S S S Q S 
S S S S S S S Q 

有什么建议吗?

【问题讨论】:

标签: c++ inheritance


【解决方案1】:

您的 squares 向量(为什么是 2D vector?固定的 2D 数组更有意义)包含实际的 Square 对象。因此,您不能在其中存储任何 QueenEmpty 对象,就像 get sliced 一样,这就是您所看到的情况。

您需要将 Square* 指针存储在您的 squares 向量中。

例如,您可以创建一个包含 8 个 Queen 对象和 56 个 Empty 对象的单独数组/向量,然后将指向这些对象的 Square* 指针存储在您的 squares 中,例如:

...
std::vector<std::vector<Square*> > squares; // or: Square* squares[8][8];
Queen queens[8];
int q_index = 0;
...

void Chessboard::setQueen(int x, int y){
    if (q_index < 8) {
        squares[x][y] = &queens[q_index++];
        squares[x][y]->setCoord(x, y);
    }
}

或者,也可以使用new 动态创建所有squares 对象(最好包裹在std::unique_ptr 中),例如:

...
std::vector<std::vector<Square*> > squares; // or: Square* squares[8][8];
...

void Chessboard::setQueen(int x, int y){
    delete squares[x][y];
    squares[x][y] = new Queen(x, y);
}
...
std::vector<std::vector<std::unique_ptr<Square>>> squares; // or: std::unique_ptr<Square> squares[8][8];
...

void Chessboard::setQueen(int x, int y){
    squares[x][y] = std::make_unique<Queen>(x, y);
}

【讨论】:

  • 好吧,我不知道切片,所以女王的功能丢失了,因为正方形只能包含正方形。我从未使用过智能指针,但在 C 中使用了一些指针(我是新手)。如果我理解您的建议,无需更改任何内容,只需使用指针而不是对象,这就是诀窍吗?
  • 嗯,正确管理这些指针本身就很棘手。但是,是的,您需要使用指针(或引用,但不能有引用向量)才能使虚函数调用起作用。
  • 我确定它是......但这是通用的想法,好的,谢谢,我会研究这些智能指针。您现在有什么网站可以很好地解释它吗?
  • @FinleyAdams 这是最好的信息来源:en.cppreference.com/w/cpp/memory/unique_ptr 它可能包含大量文字 - 请慢慢阅读,它解释了您需要的一切。
  • @alexpanter 不客气!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多