私は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ファイルを含みます。すべてのファイルは同じディレクトリにあります。
あなたは明らかに物事を学んでいます。私は本当にあなたの進歩を妨げているいくつかの「マイナー」な問題を修正する時間を取った。私は私の細目の説明が正しい道にあなたを置くことを望む。
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
+=
fails to update *this
and return the sameI 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()
{
}
あなたはクラスを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();
};
表示されたコードには、 Rational
の 2つの定義が含まれています。メソッドへのインライン実装なしで Rational
を一度使用した場合は、別のクラス
内でグループ化されているわけではなく、構造。見栄えのよいヘッダーをインクルードした後、次のように各メソッドの実装を独自に配置します。
Rational::Rational(int num = 0, int den = 1)
{
numerator = num;
denominator = den;
}
あなたが示したことは "未解決の外部"エラーにつながることはありません。それはあなたに "複数のクラス定義"エラーを与える必要があります。あなたのプロジェクトに2番目の Rational
ファイルを完全に無視していない限り、それで、あなたがそのクラスの関数のための適切な定義を与えていないので、 "未解決の外部"は確かに正しいです。