重载运算符*以获取对另一个类的实例的引用

时间:2018-10-06 15:23:02

标签: c++ pointers polymorphism operator-overloading abstract-class

我上课

class Square
{
public:
    virtual void apply(Player*) = 0; //apply square effect to the player
};

class BoardIterator
{
public:
    BoardIterator();
    Square &operator*();//return current square where player is
    Square &operator+(int);//move forward certain number of squares
private:
    static const int pathLength = 8;//length of outer path
    static const int innerPathLength = 4;//length of inner path
    int curPosition;//number of current square
    Square *outerPath[pathLength];
    Square *innerPath[innerPathLength];
};

class UpdateStatusSquare : public Board::Square
{
public:
    void apply(Player*);
};

/*
Square where player can choose career path
*/
class CareerSquaere : public Board::Square
{ 
public:
    void apply(Player*);
};

* boardIterator必须返回对Square对象的引用。 这是我对这个运算符的实现

Board::Square& Board::BoardIterator::operator*()
{
     return *(outerPath[curPosition]);
}

我尝试以此方式进行测试

Board::BoardIterator iter;
UpdateStatusSquare x = *iter;

但是我有

  

错误C2440“正在初始化”:无法从“ Board :: Square”转换为   'UpdateStatusSquare'CareersGame

我应该如何以正确的方式实现这种重载?

1 个答案:

答案 0 :(得分:0)

出什么问题了?

另一个编译器的错误消息可能使您对该问题有所了解:

  

错误:从“平方”类型转换为非标量类型   请求了“ UpdateStatusSquare”

您已定义operator*()中的BoardIterator,以返回对Square而不是UpdateStatusSquare的引用。如果按设计使用,实际上效果很好:

BoardIterator iter;
Square& x = *iter;   // no compiler issue ! I could use x later on 

您的原始分配会导致问题,因为编译器不知道如何将Square转换为UpdateStatusSquare。如果您返回的平方为CareerSquaere,编译器将如何执行此操作?

如何解决?

您需要谨慎处理抽象多态类。首先,如果您按照尝试进行值分配,则可能slice返回的对象。因此,最好使用引用,指针(或更好的智能指针)。

现在将Square(不知道是哪种特定类型的正方形)转换为downcasting。您可以使用dynamic_cast来做到这一点,但要格外小心:

UpdateStatusSquare

Demo