有人可以指出为什么我的变量无法识别以及为什么我不能重载我的运算符吗

Can someone point out why my variables are unidentified and why I can't overload my operators

本文关键字:为什么 我的 重载 运算符 识别 不能 变量      更新时间:2023-10-16

我不经常涉足C++,但我正在学习数据结构,这本书使用c ++作为语言。我目前正在讨论设置课程。

我的问题是:

  1. Visual Studio 2012 正在喋喋不休地谈论未识别的变量。我在标头中声明了变量,所以我不太确定为什么会遇到这个问题。

  2. 正在尝试重载加法和乘法运算符(作为非成员函数),但它仍在尝试使用它,就好像我只允许有一个参数用于重载一样。

以下是我正在执行的操作的一些代码:

1. 未识别变量

/* Quadratic.h */
#include <iostream>
using namespace std;
class Quadratic 
{
 public: 
     // constructors
     Quadratic::Quadratic()
     // accessors
     Quadratic::getA();
     Quadratic::getB();
     Quadratic::getC();
     // mutators
     Quadratic::setCoefficients(float coA, float coB, float coC);
private:
    float a, b, c, x;
};

二次.cpp:

/* Quadratic.cpp */
#include <iostream>
#include "Quadratic.h"
using namespace std;
class Quadratic 
{
 // Default constructor
 Quadratic::Quadratic() 
 {
     a = 0;    // Visual Studio is complaining about a, b, & c
     b = 0; 
     c = 0;
 }
 /* Mutators */
 void Quadratic::setCoefficients(float coA, float coB, float coC) 
 {
     a = coA;
     b = coB;
     c = coC;
 }
 /* Accessors */
 float Quadratic::getA() const {
     return a;
 }
 float Quadratic::getB() const {
     return b;
 }
 float Quadratic::getC() const {
     return c;
 }
};

这就是第一个问题的内容。我不太确定为什么它找不到这些变量。有人可以指出我做错了什么吗?

2. 重载运算符(参数不匹配)

/* Quadratic.h */
/* Overloading Operators */
Quadratic & operator+(const Quadratic & q1, const Quadratic & q2);
Quadratic & operator*(double r, const Quadratic & q);

它只是告诉我我有太多参数。我认为它期望做类似q1.operater+(q2)的事情,因为我希望能够做类似q3 = q1 + q2

任何指针都非常适合解决这些小问题。

编辑

根据要求出现的编译器错误:

error C2804: binary 'operator +' has too many parameters
error C2804: binary 'operator *' has too many parameters

基本上我上面提到的,也许我不清楚。

编辑 2

不知道为什么它被否决了,但如果你要投反对票,至少说明为什么......如果是因为这个问题是新手?因为这个问题的措辞或解释很差,或者只是因为你的自尊心太高?当某人试图学习新事物时,无需让他们失望。

除此之外,感谢legend2kjohnstevesaldaBasile花时间帮助我。我真的很感激。C++比Java更亲力亲为。

Quadratic.cpp中,您需要删除以下行:

class Quadratic 
{

因为这在头文件中隐藏了您对Quadratic的定义。 但是,这会在头文件中隐藏错误。 在 .h 文件中,必须指定方法的返回类型,并且不需要使用 Quadratic 限定方法名称。 若要修复运算符重载错误,请确保在头文件中的类声明之外声明它们。

class Quadratic {
     //...
     // accessors
     float getA() const;
     float getB() const;
     float getC() const;
     // mutators
     void setCoefficients(float coA, float coB, float coC);
     // rest of class definition as in question...
};   // end of class declaration
Quadratic & operator+(const Quadratic & q1, const Quadratic & q2);
Quadratic & operator*(double r, const Quadratic & q);

重载运算符可能会导致细微的错误。我强烈建议您阅读此页面以避免常见的陷阱:运算符重载

看起来您正在重新声明您的整个类。在C++中,你说class一次来声明接口(通常在h文件中),然后开始定义方法(通常在cpp文件中)。通过在两个文件中说class,您正在重新声明类而不是定义实现。

此外,您不需要在类声明中说Quadratic::,因为 class 关键字使它位于您在其中声明的任何内容根据定义都在类范围内。 相反,在编写实现时,确实需要预置Quadratic::,因为您不再在类范围内。

最后,您也不需要"使用"两次namespace std。在类声明之前将其放在 h 文件中就足够了;它也可以从 cpp 文件中的类实现访问,因为 cpp 文件包含 h 文件。

按照

John 的建议将operator+operator*函数移到类之外。但是,您必须使这些函数成为类的好友,因为您需要访问对象的私有变量。

此外,您已经将运算符函数声明为返回引用,但对于您需要q3 = q1 + q2;的语法,您必须在构造新对象后按值返回。因此,在删除当前operator+operator*功能后,您必须

class Quadratic
{
    . . .
    friend Quadratic operator+ (const Quadratic &lhs, const Quadratic &rhs);
    friend Quadratic operator+ (double scalar, const Quadratic &rhs);
}
Quadratic operator+ (const Quadratic &lhs, const Quadratic &rhs)
{
    Quadratic result;
    result.setCoefficients(lhs.a + rhs.a, lhs.b + rhs.b, lhs.c + rhs.c);
    return result;
}

如果你像这样制作构造函数

Quadratic::Quadratic(float coA = 0.f, float coB = 0.f, float coC = 0.f) :
    a(coA),
    b(coB),
    c(coC),
    x()
{
}

即使用默认参数,您可以在一行中编写运算符函数:

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

这将有助于返回值优化 (RVO),从而避免复制。同样在使用初始化列表的构造函数中,比成员赋值更好。

通常的方法是在构造函数的主体之前初始化成员变量(即字段):

Quadratic::Quadratic() : a(0), b(0), c(0), x(0) {};

然后我相信编译器会认为这些字段已初始化。(至少海湾合作委员会有)。

你可以在类声明一些运算符,见这里:

class Quadratic {
  Quadratic & operator += (const Quadratic&right);

您可以在类外声明它,例如

  Quadratic operator + (const Quadratic& left, const Quadratic& right);

正如其他人告诉您的那样,您可能希望返回值,而不是引用。

请注意,*this 是左操作数,通常应返回该操作数。

顺便说一句,请显示您收到的确切错误消息及其确切位置。