2011-10-27 1 views
1

私はC++のクラスを取っています。これは私を凶悪化させています。最も面白いのは、ガイドが私に何をすべきか正確に教えてくれるとは思われないし、ここで問題を解決するような疑問もないということです。おそらく、複数のC++コンパイラの問題が原因です。私はVisual Studio 2010を使用しています。私は、演算子のオーバーロードでクラスを作成しようとしています。C++:ナットを動かす未確認の外部

//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)); 
    } 

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

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

+0

ああ、言及を忘れてしまった、主な方法は、標準的な方法でこのすべてを呼び出し、Rational.hファイルが含まれています。すべてのファイルは同じディレクトリにあります。 – user1017413

+6

いくつかの関数を定義しておらず、正確なリンカーエラーを投稿しているようです。 –

+1

代入演算子は、現在のインスタンスへの参照を返す必要があることに注意してください。 –

答えて

3

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

  • クラスをcppファイルで再定義しています。

  • あなたが参照によって割り当ての結果を返すことができない非ボイド方法

  • の値を返すことができない(これは、適切なC++(CPPにおける実装を定義、ヘッダ内のクラス宣言)ではありません期待を壊すだけ - )が、参照によって返すことをお勧めしますと慣用句である
  • +=は、私はまた、初期化子リストを示し、OP面で+=を実装*thisを更新し、同じ

を返すことに失敗しました

//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() 
{ 
} 
+0

Cthulhuはあなたを祝福します!私は、比較的シンプルなものがあると思った。これは私がJavaを最初に学ぶために得たものです。私は前向きな考えを得るのが難しいかもしれません。いずれにしても、いくつかの悩みの後、それは期待通りにコンパイルされ、働いています。 – user1017413

2

クラスを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(); 
}; 
+0

また、宣言は.hに入り、定義は.cppになります – Dialecticus

2

あなたが示されたコードは、Rationalの定義が含まれています。メソッドへのインライン実装なしでRationalを一度使用した場合、メソッドは別の場所で定義する必要がありますが、別のclass構造内にすべてグループ化されているわけではありません。個別によさそうだヘッダを含めた後、これと同じように、独自に各メソッドの実装を置く:

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

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

関連する問題