我正在上C ++课,这让我发狂了。最有趣的部分是没有指南似乎告诉我到底该做什么,似乎没有问题可以解决这里的问题。这可能部分是由于多个C ++编译器的问题。我正在使用Visual Studio 2010,我只是想尝试使用运算符重载来构建一个类。我有我的标题,类,主要等:
//File Rational.h
#ifndef RATIONAL_H
#define RATIONAL_H
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1);
Rational operator+(const Rational &);
Rational operator=(const Rational &);
Rational operator+=(const Rational &);
int getNum();
int getDenom();
};
#endif
上课:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1)
{
numerator = num;
denominator = den;
}
Rational operator+(const Rational &r)
{
return Rational(((numerator * r.denominator) + (r.numerator * denominator)), (denominator * r.denominator));
}
Rational operator=(const Rational &r)
{
denominator = r.denominator;
numerator = r.numerator;
}
Rational operator+=(const Rational &r)
{
return Rational(((numerator * r.denominator) + (r.numerator * denominator)), (denominator * r.denominator));
}
getter函数是你所期望的,不会出错,但是构造函数和重载方法给了我未解析的外部函数。我甚至不记得我在方法和标题中尝试了多少东西。我见过十几个指南和例子,但没有一个有效。我确实用+操作数作为友元函数编译了一次,但是它需要是赋值的成员函数,并且将它移动到成员函数以某种方式设法破坏了上述所有内容。我在这里疯了。无论我做什么,它都无法解决这些方法!
main方法以标准方式调用所有这些,并包含Rational.h文件。所有文件都在同一目录中。
答案 0 :(得分:3)
你显然在学习东西。我花时间修复了一些真正会妨碍你进步的“小问题”;我希望我的速记解释会让你走上正确的道路。
您正在cpp文件中重新定义类;这不是正确的C ++(在头文件中声明类,在cpp中定义实现):
您无法在非空方法中返回值
+=
无法更新*this
并返回相同的我还演示了初始化列表,并使用术语op +=
operator+
//File Rational.h
#ifndef RATIONAL_H
#define RATIONAL_H
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1);
Rational operator+(const Rational &) const;
Rational& operator=(const Rational &);
Rational& operator+=(const Rational &);
int getNum();
int getDenom();
};
#endif
main.cpp中:
#include "rational.h"
#include <iostream>
using namespace std;
Rational::Rational(int num, int den)
: numerator(num), denominator(den) // prefer initializer lists
{
}
Rational Rational::operator+(const Rational &r) const
{
return Rational(
((numerator * r.denominator) +
(r.numerator * denominator)),
(denominator * r.denominator));
}
Rational& Rational::operator=(const Rational &r)
{
denominator = r.denominator;
numerator = r.numerator;
return *this; // ADDED
}
Rational& Rational::operator+=(const Rational &r)
{
return *this = (*this) + r;
}
int main()
{
}
答案 1 :(得分:2)
你要两次宣布上课。
您的标题看起来应该如此,但是当您定义函数时,它们不应该包含在类块中。
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1);
Rational operator+(const Rational &);
Rational operator=(const Rational &);
Rational operator+=(const Rational &);
int getNum();
int getDenom();
};
现在在.cpp。
中定义它Rational::Rational(int num , int den )
{
//Stuff Goes hear
}
还记得你可以内联定义函数。
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1)
{
//Stuff Goes hear
}
Rational operator+(const Rational &);
Rational operator=(const Rational &);
Rational operator+=(const Rational &);
int getNum();
int getDenom();
};
答案 2 :(得分:2)
您展示的代码包含Rational
的两个定义。如果您有Rational
一次没有方法的内联实现,则需要在其他地方定义方法,但单独,并非所有方法都在另一个class
结构内。在包含看起来不错的标题之后,将每个方法的实现放在自己的位置,如下所示:
Rational::Rational(int num = 0, int den = 1)
{
numerator = num;
denominator = den;
}
但是,您所展示的内容不会导致“未解决的外部”错误。它应该给你“多类定义”错误。除非您完全忽略了在项目中包含第二个Rational
文件。然后“未解析的外部”确实是正确的,因为您没有为该类中的函数提供正确的定义。