C ++:未解决的外部因素让我疯狂

时间:2011-10-27 22:29:28

标签: c++ visual-studio-2010

我正在上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文件。所有文件都在同一目录中。

3 个答案:

答案 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文件。然后“未解析的外部”确实是正确的,因为您没有为该类中的函数提供正确的定义。