有人可以指出为什么我的变量不明,以及为什么我不能重载我的运算符

时间:2013-10-12 19:31:50

标签: c++ class operator-overloading

我不经常涉及C ++,但我正在学习数据结构,本书使用c ++作为语言。我现在正在设置课程。

我的问题是:

  1. Visual Studio 2012对未识别的变量大肆宣传。我在标题中声明了变量,所以我不太清楚为什么我会遇到这个问题。

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

  3. 以下是我正在做的一些代码:

    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;
    
    };
    

    Quadratic.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

    不确定为什么会被投票,但如果你打算投票,至少说明原因......如果是因为问题是新手?因为问题措辞不力或解释不清,或者仅仅因为你的自负太高了?当他们试图学习新东西时,不需要让别人失望。

    除此之外,谢谢 legend2k john 史蒂夫 salda basile < / em>所有人都花时间帮助我。我真的很感激。 C ++比Java要多得多。

4 个答案:

答案 0 :(得分:5)

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);

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

答案 1 :(得分:2)

看起来你要重新宣布全班。在C ++中,你说类一次声明接口(通常在h文件中),然后继续定义方法(通常在cpp文件中)。通过在两个文件中说class,您将重新声明该类,而不是定义实现。

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

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

答案 2 :(得分:2)

operator+operator*函数移到类外John suggested。但是,您需要将这些函数作为类的朋友,因为您需要访问对象的私有变量。

此外,您已将运算符函数声明为返回引用,但对于您需要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);
}

这将有助于return value optimization (RVO)避免复制。同样在构造函数中使用初始化列表而不是成员赋值is better

答案 3 :(得分:1)

通常的方法是在构造函数的主体:

之前初始化成员变量(即字段)
Quadratic::Quadratic() : a(0), b(0), c(0), x(0) {};

然后我相信编译器会将字段视为已初始化。 (至少GCC会这样做。)

你可以在类中声明一些运算符,请参阅here

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

你可以在课堂外声明它,例如

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

正如其他人告诉你的那样,你可能想要返回一个值,而不是一个引用。

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

顺便说一句,请显示您所获得的确切错误消息及其准确位置。