C ++:ナットを運転している未解決の外部

私は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 
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));
    }

ゲッター関数は期待通りのものであり、エラーもありませんが、コンストラクターとオーバーロードされたメソッドは未解決の外部を提供します。私は方法とヘッダーで試したことがどれくらいのものか覚えていない。私はダースかそこらのガイドと例を見てきましたが、どれも働いていませんでした。私はこれをfriend関数として+オペランドで一度コンパイルするようにしましたが、代入のメンバ関数である必要があり、それをメンバ関数に移動すると何とか上記をすべて破ってしまいました。私はここでナッツに行くよ。私が何をしてもそれらの方法は解決しません!

mainメソッドは標準的な方法ですべてを呼び出し、Rational.hファイルを含みます。すべてのファイルは同じディレクトリにあります。

1
ああ、忘れて言えば、mainメソッドは標準的な方法でこれを呼び出し、Rational.hファイルを含みます。すべてのファイルは同じディレクトリにあります。
追加された 著者 user1017413,
演算子 = + = は、参照によって * this を返す必要があります。
追加された 著者 Kerrek SB,
正確なリンカーエラーを投稿して、いくつかの関数を定義していないようです。
追加された 著者 K-ballo,
代入演算子は、現在のインスタンスへの参照を返す必要があることに注意してください。
追加された 著者 K-ballo,
あなたはチュートリアルや入門書を見たいかもしれません。ヘッダーに型を定義する場合は、別の翻訳単位でクラスを再度定義することはできませんが、メンバ関数を定義するだけです。
追加された 著者 David Rodríguez - dribeas,
2つのコードサンプルがソースファイルとヘッダーファイルですか?
追加された 著者 radman,

3 答え

あなたは明らかに物事を学んでいます。私は本当にあなたの進歩を妨げているいくつかの「マイナー」な問題を修正する時間を取った。私は私の細目の説明が正しい道にあなたを置くことを望む。

  • You are redefining the class in a cpp file; this is not proper C++ (declare the class in the header, define the implementation in the cpp):

  • You fail to return values in non void methods

  • You fail to return the result of assignment by reference (only breaks expectations - but returning by reference is recommend and idiomatic)
  • += fails to update *this and return the same

I also demonstrated initializer lists and implemented += in terms 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 
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()
{
}
3
追加された
Cthulhuはあなたを祝福します!私は、比較的シンプルなものがあると思った。これは私がJavaを最初に学ぶために得たものです。私は前向きな考えを得るのが難しいかもしれません。いずれにしても、いくつかの悩みの後、それは期待通りにコンパイルされ、働いています。
追加された 著者 user1017413,

あなたはクラスを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
追加された
また、宣言は.hに入り、定義は.cppに入ります。
追加された 著者 Dialecticus,

表示されたコードには、 Rational 2つの定義が含まれています。メソッドへのインライン実装なしで Rational を一度使用した場合は、別のクラス内でグループ化されているわけではなく、構造。見栄えのよいヘッダーをインクルードした後、次のように各メソッドの実装を独自に配置します。

Rational::Rational(int num = 0, int den = 1)
{
    numerator = num;
    denominator = den;
}

あなたが示したことは "未解決の外部"エラーにつながることはありません。それはあなたに "複数のクラス定義"エラーを与える必要があります。あなたのプロジェクトに2番目の Rational ファイルを完全に無視していない限り、それで、あなたがそのクラスの関数のための適切な定義を与えていないので、 "未解決の外部"は確かに正しいです。

2
追加された