我不经常涉及C ++,但我正在学习数据结构,本书使用c ++作为语言。我现在正在设置课程。
我的问题是:
Visual Studio 2012对未识别的变量大肆宣传。我在标题中声明了变量,所以我不太清楚为什么我会遇到这个问题。
我正在尝试重载加法和乘法运算符(作为非成员函数),但它仍然试图使用它,好像我只允许有一个参数用于重载。
以下是我正在做的一些代码:
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要多得多。
答案 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
是左操作数,通常应返回。
顺便说一句,请显示您所获得的确切错误消息及其准确位置。