de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 user1017413
user1017413
質問

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 2011-10-27T22:29:27+00:00 3
 K-ballo
K-ballo
編集された質問 27日 10月 2011 в 10:31
プログラミング
c++
visual-studio-2010
sehe
27日 10月 2011 в 10:38
2011-10-27T22:38:57+00:00
さらに
ソース
編集
#56793762

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

  • 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
0
rerun
27日 10月 2011 в 10:36
2011-10-27T22:36:03+00:00
さらに
ソース
編集
#56793760

あなたはクラスを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
0
Rob Kennedy
27日 10月 2011 в 10:38
2011-10-27T22:38:29+00:00
さらに
ソース
編集
#56793761

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

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

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

2
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 6日前
2
Hideo Nakagawa
登録済み 1週間前
3
Sergiy Tytarenko
登録済み 1週間前
4
shoxrux azadov
登録済み 1週間前
5
Koreets Koreytsev
登録済み 1週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属