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

真的吗?

我的第二个问题是,当我使用类名、函数名和构造函数名作为距离而不是距离时,就会出现以下错误

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's中已经定义了一个名为“distance”的类xutility(不知道这是什么,只是从错误消息中得到这个)。

此外,您正在重新发明除法:),而不是 while 循环,您可以这样做

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

此外,正如您被“告知”这是错误的方法,我可以在这里看到 2 条建议。一,由于这仅适用于2个对象,您可以通过添加循环使其适用于多个对象的添加。传递一个数组,而不是传递 2 个对象作为参数。第二,正如其他答案所指出的,重载+运算符更直观。

于 2013-08-15T06:21:33.650 回答
2

我认为您的“先生”试图告诉您的是,使用您的方法将不可能实现以下操作

Distance d1,d2,d3,d4;

d4 = d1 + d2 + d3;

我宁愿重载“+”运算符,而不是定义一个 Add 函数。正在做

d4 = d1 + d2 + d3

非常直观。

关于第二个问题,当您将距离重命名为距离时,它与 STL 距离函数冲突。这个函数在 std 命名空间之外,但是因为你已经写了

using namespace std

它已经变得可见,因此冲突

于 2013-08-15T06:27:00.830 回答
1

0xc0de 回答了 Visual Studio 错误的原因,并提供了一个很好的技巧来简化英尺和英寸的计算。

其他人指出的是,您这样做的方式限制了您总是在现有距离中添加两个距离。它更干净,您可以通过在距离类上提供 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 回答