我上课
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
我应该如何以正确的方式实现这种重载?
答案 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