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方法中无法返回值

  • 您未能通过引用返回赋值结果(只会打破预期-但通过引用返回是推荐的和惯用的)
  • +=
    无法更新
    *此
    并返回相同内容
我还演示了初始值设定项列表,并用op
操作符+
实现了
+=

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方法中无法返回值

  • 您未能通过引用返回赋值结果(只会打破预期-但通过引用返回是推荐的和惯用的)
  • +=
    无法更新
    *此
    并返回相同内容
艾尔