0

我创建了代表线的类,aX + bY = c 我希望重载+运算符提高线(返回更高的线,所以我在下面做了,但编译器说invalid use of this

class Linia{
public:
    double a,b,c;
    Linia (double a, double b, double c){
        this->a = a;
        this->b = b;
        this->c = c;
    }
   friend Linia operator+ (double i){
   return new Linia(a, this->b, this->c + i/this->b);
}
};

我想返回Linia具有如上所示字段的新对象iint我不想修改原始对象

4

4 回答 4

5

你有一些基本的语法问题。

  • this是一个指针,因此您需要使用->它来取消引用它。

  • 我假设你的意思是this->c + i.c而不是this->c + i

  • 您不需要(也可能不应该)让操作员成为朋友。

  • 返回新实例(如operator+)的运算符应该按值返回,而不是在堆上分配。

  • 运算符通常将参数作为const引用(因为您不应该修改操作数)。

我认为你的意思是有这样的东西:

class Linia{
public:
    double a,b,c;
    Linia (double a, double b, double c){
        this->a = a;
        this->b = b;
        this->c = c;
    }
    Linia operator+ (const Linia& i){
        return Linia(this->a, this->b, this->c + i.c / this->b);
    }
};

你可以把它清理成这样:

class Linia{
public:
    double a,b,c;
    Linia (double a, double b, double c)
        : a(a), b(b), c(c)
    { }

    Linia operator+ (const Linia& i){
        return Linia(a, b, c + i.c / b);
    }
};
于 2013-01-30T17:45:17.543 回答
1

您的代码中至少存在两个问题。首先,您已声明operator+为朋友,因此它是一个免费函数,没有this. 遗憾的是,从代码中,我无法弄清楚您要做什么(重载一元+或重载二进制+),因此很难说更多。其次,您试图返回 的结果new,这是一个指针,而不是对象类型。 operator+应该总是返回一个对象类型,所以你不想要new.

于 2013-01-30T17:46:14.270 回答
1

假设您operator+是一个二元运算符,它接受两个Linias 作为输入并返回一个Linea已添加的系数,您可能希望定义一个自由函数重载,输入soperator+具有适当的 const 正确性,如下所示:Linia

Linia operator+(const Linia& lhs, const Linia& rhs)
{
    return Linia
    (
        lhs.a + rhs.a,
        lhs.b + rhs.b,
        lhs.c + rhs.c
    );
}
于 2013-01-30T17:47:42.663 回答
1

由于您将其声明为friend,因此您的加法运算符不是成员函数,因此它必须采用两个参数,并且无法访问this

friend Linia operator+ (const Linia& lhs, const Linia& rhs)
{
  return Linia(lhs.a, lhs.b, lhs.c + rhs/lhs.b);
}

这遵循代码中的逻辑,但仅在有 operator 时才有效double operator/(const Linia& lhs, double)。直觉上有意义的事情是

friend Linia operator+ (const Linia& lhs, const Linia& rhs)
{
  return Linia(lhs.a+rhs.a, lhs.b+rhs.b, lhs.c + rhs.c);
}

最后,您可以完全避免friend声明,只需将运算符声明为标准的非成员函数。它不访问任何私人或受保护的数据,因此它不需要成为朋友。

于 2013-01-30T17:48:24.160 回答