c++:无法解决的外部问题让我抓狂
C++: Unresolved externals driving me nuts
我正在上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
和class:
#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函数是你所期望的,不会出错,但构造函数和重载方法给了我未解决的外部。我甚至不记得我在方法和header中尝试了多少东西。我看过一打左右的指南和例子,但没有一个奏效。我确实用+操作数作为朋友函数编译了一次,但它需要是赋值的成员函数,并且将其移动到成员函数以某种方式设法打破了上述所有问题。我要疯了。无论我做什么,它都无法解决这些方法!
main方法以标准方式调用所有这些,并包含Rational.h文件。
你显然在学习。我花时间解决了一些会阻碍你进步的"小"问题;我希望我的速记解释能使你走上正确的道路。
-
你正在一个cpp文件中重新定义类;这是不合适的c++(在头文件中声明类,在cpp中定义实现):
-
在非void方法中返回值失败
- 没有返回引用赋值的结果(这只会破坏预期——但是通过引用返回是推荐的和习惯的)
-
+=
更新*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()
{
}
您声明了两次类。
你的头应该看起来像它一样,但是当你定义函数时,它们不应该被包装在一个类块中。
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
而没有内联实现方法,则需要在其他地方定义方法,但要分别定义,而不是将所有方法分组在另一个class
结构中。在包含了看起来不错的头文件之后,将每个方法的实现单独放置,如下所示:
Rational::Rational(int num = 0, int den = 1)
{
numerator = num;
denominator = den;
}
但是,您所显示的内容不会导致"未解决的外部"错误。它应该给你"多个类定义"错误。除非您完全忽略了在项目中包含第二个Rational
文件。那么"未解析的外部"确实是正确的,因为您没有为该类中的函数提供适当的定义。
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 节俭并发:未解决的外部问题
- 未解决的外部链接问题
- 在 C++ 中使用 C 代码与外部"C"的问题
- build命令失败,外部原生问题android工作室
- 外部模板 c++ 的问题
- 编译示例 Cinder 项目时存在大量未解决的外部问题
- 为使用boost的预开发库构建c++包装器时未解决的外部问题
- QtCreator - 编译问题 - 外部源文件
- 外部库Boost版本问题
- 命名空间外部变量的未定义参考/多重定义,C 结构问题
- 外部变量和数组声明问题C
- 伊利希特中未解决的外部问题
- Clang AST : 外部链接规范问题
- VS2013与QT5.3.2使用Websocket,并得到一个未解决的外部符号问题
- 在Visual Studio 2013中尝试使用C++连接到mysql时未解决的外部问题
- 从导致问题的java进程附加到外部c++进程
- 使用SetParent将窗口嵌入外部进程的各种问题
- 格鲁问题,未解决的外部问题
- 带有 OO 的模板导致未解决的外部符号问题