3

如何从其基类 Vect 的派生类 nVect 调用 operator*?

class Vect
{

protected:
    int v1_;
    int v2_;
    int v3_;

public:
    Vect( int v1, int v2, int v3 );
    Vect( const Vect &v);
    ~Vect();
    friend const Vect operator*(Vect& v, int n);
    friend const Vect operator*(int n, Vect& v);
};


class nVect : public Vect 
{
//private 
    int pos_;
    int value_;

    void update();

public:
    nVect(int v1, int v2, int v3, int pos, int value);
    nVect(const Vect & v, int pos, int value);
    ~nVect();

    friend const nVect operator*(nVect& v, int n);
    friend const nVect operator*(int n, nVect& v);
};

现在,编译器在以下代码行抱怨:

const nVect operator*(nVect& v, int n)
{
    return nVect(Vect::operator*(v, n), v.pos_, v.value_);
}

错误:“操作员*”不是“Vect”的成员。

怎么了?

谢谢大家!乔纳斯

4

1 回答 1

4

它是一个自由函数,它被声明friendVect,而不是 的成员函数Vect(即使它看起来像在类中定义的成员函数,但这并不重要,请参阅常见问题解答以获取更多信息)。你需要

const nVect operator*(nVect& v, int n)
{
    return nVect(static_cast<Vect&>(v)*n, v.pos_, v.value_);
}

也就是说,operator*如果您修改参数,调用者通常会非常惊讶地使用非常量引用作为调用者。此外,没有理由返回 const 值,所以我建议您将签名更改为:

nVect operator*(const nVect& v, int n)
{
    return nVect(static_cast<const Vect&>(v)*n, v.pos_, v.value_);
}

(同样对于Vect::operator*

于 2013-11-02T16:26:08.257 回答