2013-08-15 4 views
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(); 
} 

내 프로그램은 잘 작동하지만 내 선생님은 그가 why.He 내 접근 방식은 좀 더 개체를 추가 할 때 작동하지 않습니다 나에게 말하지 않았지만 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)' 
+1

을 달성하기 위해'main'는'INT를 반환해야합니다 '. 객체를 추가하는 올바른 방법은'operator +'와'operator + ='를 오버로드하는 것입니다. – chris

+0

죄송합니다. chris, 저는 오브젝트 자체가 아닌 2 개의 오브젝트의 가치를 더하는 방법을 묻고 싶습니다. – Freedom911

+0

'add '와 같은 이름으로, Java 접근 방식에 대한 연산자 접근 방식을 선호합니다. 평론가가 얻는 것은 아마 당신이 사슬을지지하지 않는다는 것입니다. – chris

답변

1

0xc0de는 비주얼 스튜디오 오류의 원인에 대한 답변과 피트의 계산을 단순화 할 수있는 좋은 팁을 제공하고 있기 때문에이 기능은 unside 표준 namepspace하지만, 및 인치.

다른 사람들이 지적한 바는 기존 거리에 정확히 두 개의 거리를 추가하는 것을 제한한다는 것입니다. 클리너이므로 거리 클래스에 연산자 +, 연산자 + = 및 연산자 =를 추가하여 제한없이 체인을 추가 할 수 있습니다. 이것은 클래스를 확장하는 매우 일반적인 방법입니다. 객체의 내부 값만 추가하는 것이 사실이지만, 이는 대개의 경우 해당됩니다.로

5

을오고 visual studioxutility에 'distance'라는 이름으로 정의되어 있습니다 (이것이 무엇인지 모르는 경우 오류 메시지에서 방금 얻었습니다). 당신이 내가이 개 제안을 볼 수있는 잘못된 접근이라고 '말'한으로 또한

대신 while 루프의에서 부문 : 다시 발명하는 당신은

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

또한 할 수있다 이리. One은 2 개의 오브젝트에 대해서만 작동하기 때문에 여러 오브젝트의 추가 작업을 반복 할 수 있습니다. 2 개의 객체를 매개 변수로 전달하는 대신 배열을 전달하십시오. 둘째, 다른 답변에서 지적했듯이 + 연산자의 오버로드가 더 직관적입니다.

+0

'inches'는 float입니다 – 6502

+0

@ 6502 : 예, 감사합니다 :) – 0xc0de

+1

문제는 나누기가 아니라 모듈러스 연산자입니다. '3.5' 인치를 사용하여 코드를 시도 했습니까? – 6502

2

나는 무엇을 당신의 "선생님이"당신을 말할려고하는 것은 늘 다음과 같은 접근 방식에 뭔가 내가 추가 기능을 정의하기보다는 "+"연산자를 오버로드하는 것을 선호

Distance d1,d2,d3,d4; 

d4 = d1 + d2 + d3; 

할 수 있다고 생각합니다. Doing

d4 = d1 + d2 + d3 

은 매우 직관적입니다.

두 번째 질문에 대해서는 거리를 거리로 바꾸면 STL 거리 함수와 충돌합니다. 당신이

using namespace std 

가 표시되고있다 wirtten 따라서 conflicy

1

당신은 + 연산자를 오버로드 할 수 있습니다

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

this 포인터에 대한 참조를 반환하는 것은 당신을 도울 수의 특정 사용

distances a = b + c + d; 
관련 문제