C++;:无法解决的外部问题让我发疯 我正在上C++课,这让我发狂。最有趣的是,似乎没有任何指南告诉我该做什么,也没有任何问题可以解决这个问题。这可能部分是因为多个C++编译器的问题。我使用的是VisualStudio2010,我只是尝试用操作符重载构建一个类。我有我的标题、类别、主要内容等: //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
班级:C++;:无法解决的外部问题让我发疯 我正在上C++课,这让我发狂。最有趣的是,似乎没有任何指南告诉我该做什么,也没有任何问题可以解决这个问题。这可能部分是因为多个C++编译器的问题。我使用的是VisualStudio2010,我只是尝试用操作符重载构建一个类。我有我的标题、类别、主要内容等: //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,c++,visual-studio-2010,C++,Visual Studio 2010,班级: #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; }
#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));
}
#包括“stdafx.h”
#包括
使用名称空间std;
类理性
{
私人:
整数分子;
整数分母;
公众:
Rational(int num=0,int den=1)
{
分子=num;
分母=den;
}
Rational操作符+(constrational&r)
{
返回有理数(((分子*r.分母)+(r.分子*分母)),(分母*r.分母));
}
有理运算符=(constrational&r)
{
分母=r.分母;
分子=r.分子;
}
有理运算符+=(const Rational&r)
{
返回有理数(((分子*r.分母)+(r.分子*分母)),(分母*r.分母));
}
getter函数是您所期望的,不会出错,但是构造函数和重载方法给了我未解析的外部函数。我甚至记不起我在方法和头中尝试了多少东西。我看过十几个指南和示例,但没有一个起作用。我确实用+操作数编译过一次一个友元函数,但它必须是赋值的成员函数,并且将其移动到成员函数以某种方式破坏了上述所有功能。我在这里发疯了。无论我做什么,它都无法解决这些方法
main方法以标准方式调用所有这些,并包括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();
};
现在在.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();
};
您将声明该类两次 您的头应该看起来像它一样,但是当您定义函数时,它们不应该包装在类块中
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();
};
您所展示的代码包括
Rational
的两个定义。如果您有Rational
一次,但没有方法的内联实现,那么这些方法需要在其他地方定义,但需要单独定义,而不是全部分组在另一个类
结构中。在包含标题(看起来不错)后,将实现放入每种方法都有各自的特点,如下所示:
Rational::Rational(int num = 0, int den = 1)
{
numerator = num;
denominator = den;
}
不过,您所展示的不会导致“未解决的外部”错误。它应该会给您带来“多类定义”错误。除非您完全忽略了在项目中包含第二个
Rational
文件。然后是“未解决的外部”确实是正确的,因为您没有为该类中的函数提供正确的定义。您显示的代码包括Rational
的两个定义。如果您有Rational
一次,但没有方法的内联实现,那么这些方法需要在其他地方定义,但需要单独定义,而不是在内部分组ther类
结构。在包含标题(看起来不错)后,将每个方法的实现放在自己的位置上,如下所示:
Rational::Rational(int num = 0, int den = 1)
{
numerator = num;
denominator = den;
}
不过,您所展示的不会导致“未解决的外部”错误。它应该会给您带来“多类定义”错误。除非您完全忽略了在项目中包含第二个
Rational
文件。然后是“未解决的外部”确实是正确的,因为您没有为该类中的函数提供正确的定义。您显然学到了一些东西。我花时间解决了一些确实会阻碍您进步的“次要”问题;我希望我的速记解释会让您走上正确的道路
-
<> >您在CPP文件中重新定义类;这不是正确的C++(在报头中声明类,定义CPP中的实现):
- 在非void方法中无法返回值
- 您未能通过引用返回赋值结果(只会打破预期-但通过引用返回是推荐的和惯用的)
无法更新+=
并返回相同内容*此
操作符+
实现了+=
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()
{
}
#包括“rational.h”
#包括
使用名称空间std;
Rational::Rational(int num,int den)
:分子(num)、分母(den)//首选初始值设定项列表
{
}
Rational::operator+(constrational&r)const
{
回归理性(
((分子*r分母)+
(r.分子*分母)),
(分母*r.分母));
}
Rational&Rational::operator=(constrational&r)
{
分母=r.分母;
分子=r.分子;
return*this;//已添加
}
Rational&Rational::operator+=(constrational&r)
{
返回*this=(*this)+r;
}
int main()
{
}
你显然学到了很多东西。我花时间解决了一些真正会阻碍你进步的“小”问题;我希望我的速记解释会让你走上正确的道路
-
<> >您在CPP文件中重新定义类;这不是正确的C++(在报头中声明类,定义CPP中的实现):
- 在非void方法中无法返回值
- 您未能通过引用返回赋值结果(只会打破预期-但通过引用返回是推荐的和惯用的)
无法更新+=
并返回相同内容*此