c++:无法解决的外部问题让我抓狂

C++: Unresolved externals driving me nuts

本文关键字:问题 外部 解决 c++      更新时间:2023-10-16

我正在上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文件。那么"未解析的外部"确实是正确的,因为您没有为该类中的函数提供适当的定义。