2

クラスの2つのオブジェクトを追加するためのプログラムを書いていました。

//program for adding 2 objects data of same class

#include<iostream>

using namespace std;

class distances
{
private:
    int feet;
    float inches;
public:
    distances()  //constructor
    {
        feet = 0;
        inches = 0.0;
    }

    distances(int f, float i) //constructor
    {
        feet = f;
        inches = i;
    }

    void get_data() //taking value
    {
        cout << "Enter the distance in feet and inches :: " << "\n";
        cin >> feet >> inches;
    }

    void show_data() //showing data
    {
        cout << "The distance in feet is ::" << feet
             << " and in inches is :: " << inches;
    }

    void add(distances d1, distances d2); //adding to objects
};

void distances::add(distances d1, distances d2)
{
    inches = d1.inches + d2.inches;
    feet = 0;

    while(inches >= 12)
    {
        inches = inches - 12;
        ++feet;
    }

    feet += d1.feet + d2.feet;
}

void main()
{
    distances d1, d2, d3;
    d1.get_data();
    d2.get_data();
    d3.add(d1, d2);
    d3.show_data();
    getch();
}

私のプログラムは問題なく動作しましたが、2 つのオブジェクトを追加するという私のアプローチは間違っていたと先生は言いましたが、理由は教えてくれませんでした。なぜ私のアプローチが間違っていたのかわかりません。私の友人は、私の問題はd3.add(d1,d2);の行にあるかもしれないと言いました。

本当?

私の2番目の問題は、クラス名、関数名、およびコンストラクター名を距離の代わりに距離として使用すると、次のエラーが発生することでした

1>c:\users\abc\documents\visual studio 2010\projects\pass\pass\pass.cpp(47): error C2872: 'distance' : ambiguous symbol
1>          could be 'c:\users\abc\documents\visual studio 2010\projects\pass\pass\pass.cpp(6) : distance'
1>          or       'c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(899) : iterator_traits<_Iter>::difference_type std::distance(_InIt,_InIt)'
4

4 に答える 4

3

visual studioに「距離」という名前で定義されたクラスが既にあるため、エラーが発生していますxutility(これが何であるかはわかりません。エラーメッセージからこれを取得しただけです)。

また、あなたは分割を再発明しています:)、 while ループの代わりに、あなたはただ行うことができます

carry = int(inches / 12);
inches = int(inches) % 12;
feet += carry;

また、これは間違ったアプローチであると「言われた」ので、ここで2つの提案を見ることができます。1つ、これは2つのオブジェクトに対してのみ機能するため、ループで追加することにより、複数のオブジェクトの追加に対して機能させることができます。2 つのオブジェクトをパラメーターとして渡す代わりに、配列を渡します。2つ目は、他の回答が指摘したように、+オペレーターのオーバーロードはより直感的です。

于 2013-08-15T06:21:33.650 に答える
2

あなたの「先生」があなたに伝えようとしていたことは、あなたのアプローチでは次のようなことが可能ではないということだと思います

Distance d1,d2,d3,d4;

d4 = d1 + d2 + d3;

Add 関数を定義するよりも、"+" 演算子をオーバーロードしたいと思います。やっている

d4 = d1 + d2 + d3

とても直感的です。

2番目の質問に関して、距離を距離に名前変更すると、STL距離関数と競合します。この関数はstd namepspaceの外側にありますが、あなたが書いたので

using namespace std

それが目に見えるようになり、それゆえに対立が生じる

于 2013-08-15T06:27:00.830 に答える
1

0xc0de は、Visual Studio エラーの理由に答え、フィートとインチの計算を簡素化するための良いヒントを提供しました。

他の人が指摘したのは、あなたが行った方法では、既存の距離に常に正確に2つの距離を追加することに制限されているということです. 距離クラスに operator+、operator+=、operator= を指定することで、よりクリーンになり、追加を無制限に連鎖させることができます。これは、クラスを拡張するための非常に一般的な方法です。オブジェクトの内部値のみを追加しているのは事実ですが、それは非常によくあることです。

于 2013-08-15T06:29:02.480 に答える
1

+次のように演算子をオーバーロードできます。

distances& operator+(const distances& obj1)
{
inches+=(obj1.inches)%12;
feet+=obj1.feet + (obj1.inches)/12;
return *this;
}

ポインターへの参照を返す特定の使用法は、this達成に役立つ場合があります

distances a = b + c + d;
于 2013-08-15T06:29:18.987 に答える