我怎样才能调用另一个类的功能?

时间:2016-01-04 02:46:08

标签: c++ function oop friend

class Bishop : public ChessPiece {
    public:
    friend class Queen;
    Bishop(string colorIn, string nameIn);

    //isLegalMove for bishop
    //implemented this function for queen
    bool isLegalBishopMove(int xSrc, int ySrc, int xDest, int yDest);

    //Can move along any diagnol
    virtual bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest) ;
};


class Queen : public ChessPiece {
 public:
    //friend class Bishop;

    Queen(string colorIn, string nameIn);
    //friend bool Bishop::isLegalBishopMove(int xSrc, int ySrc, int xDest, int yDest);

    virtual bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest);
};

我希望我的女王级isLegalMove的实现能够调用函数isLegalBishopMove。我怎么解决这个问题?我尝试使用朋友,但它没有用。我不理解c ++参考文献。

3 个答案:

答案 0 :(得分:5)

  

我认为自由职能或公众没有错   静态方法。我更喜欢他们继承。

static bool Queen::isLegalMove(Position poscurr, Position posnew)

static bool Bishop::isLegalMove(Position poscurr, Position posnew)

答案 1 :(得分:2)

您不能在类的层次结构中调用横向方法。如果Queen不是Bishop的子类,那么尝试调用Bishop类的方法没有任何意义,friend指令在这里没有帮助,因为你是尝试通过包含与前者不直接相关的另一个类的行为来添加类定义的行为。

我看到两种可能的解决方案:

  • 制作方法static,以便您可以从任何上下文中自由调用
  • 使用多个virtual继承

第二种方法类似于以下方法,但我不鼓励考虑这一点,因为多重继承有其注意事项,在尝试使用之前必须完全理解。

class ChessPiece
{
   virtual bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest) = 0;
};

class Rook : public ChessPiece {
 ...
};

class Bishop : public ChessPiece {
 ...
};

class Queen : public virtual Rook, public virtual Bishop {
  bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest) override {
    return Bishop::isLegalMove(xSrc,ySrc,xDest,yDest) || Rook::isLegalMove(xSrc, ySrc,xDest,yDest);
  }
};

请注意,将移动的源位置传递给isLegalMove在面向对象的环境中没有多大意义,源位置应该包含在ChessPiece实例中,除非您使用的是对象层次结构只是为了实现行为(而不是片段状态)。

答案 2 :(得分:1)

您可以Queen::isLegalMove使用Bishop::isLegalMove - 大概是Castle - 如下所示:

virtual bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest)
{
    return Bishop().isLegalMove(xSrc, ySrc, xDest, yDest) ||
           Rook().isLegalMove(xSrc, ySrc, xDest, yDest);
}

几点:

  • 这些功能显然(对于那些甚至不知道下棋的人),不需要知道关于它们被调用的Queen件的任何其他内容,所以从这个角度看它们可能是static,但之后无法使用虚拟调度来调用它们,您似乎想要这样做,这可能真正有助于保持代码简单

    • 函数不接受Board对象 - 以请求移动的方式检查碎片 - 暗示Board可用作全局或单个;在编程中一般都不鼓励,因为它很难做一些事情,比如创建一个Board的树,你可以通过一定数量的动作来达到,以评估“计算机”玩家应该做出哪些动作
  • 我建议反对Queen公开派生Bishop或其他不是 - 尝试保留“是一种”公共派生的关系; Queen是一种(类型)Bishop根本不是真的,可能会导致意外麻烦,因为Bishop的逻辑会无意影响{{1 }}Š