我正在编写一个程序来添加一个类的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)'
答案 0 :(得分:3)
您收到错误,因为已经在visual studio
的{{1}}中定义了名为'distance'的类(不知道这是什么,只是从错误消息中得到了这个) )。
此外,你正在重新发明分部:),而不是你可以做的while循环
xutility
另外,由于你被告知这是错误的方法,我可以在这里看到2条建议。一,由于这仅适用于2个对象,因此可以通过添加循环使其适用于多个对象的添加。不是传递2个对象作为参数,而是传递数组。
其中两个答案指出,重载carry = int(inches / 12);
inches = int(inches) % 12;
feet += carry;
运算符更直观。
答案 1 :(得分:2)
我认为你的“先生”试图告诉你的是,你的方法跟随下面的事情是不可能的
Distance d1,d2,d3,d4;
d4 = d1 + d2 + d3;
我更喜欢重载“+”运算符而不是定义Add函数。做
d4 = d1 + d2 + d3
非常直观。
关于第二个问题,当您将距离重命名为距离时,它会与STL距离函数冲突。这个函数是unside std namepspace,但是因为你有wirtten
using namespace std
它已经变得可见,因此是冲突的
答案 2 :(得分:1)
0xc0de回答了Visual Studio错误的原因,并提供了一个很好的提示来简化英尺和英寸的计算。
其他人指出的是,你这样做的方式限制你总是在现有距离中准确地添加两个距离。它更清洁,您可以通过在距离等级上提供operator +,operator + =和operator =来无限链接添加。这是扩展类的一种非常常见的方法。确实,您只是添加对象的内部值,但情况往往如此。
答案 3 :(得分:1)
您可以将+
运算符重载为:
distances& operator+(const distances& obj1)
{
inches+=(obj1.inches)%12;
feet+=obj1.feet + (obj1.inches)/12;
return *this;
}
返回对this
指针的引用的具体用法可能有助于您实现
distances a = b + c + d;