2014-02-16 2 views
0

object 클래스는 반올림 연산자 인 ==!= 연산자를 제외하고 C++로 잘 작성되었습니다. 나는 다음과 같이 2 개의 객체를 가지고 시도했다. 둘 다 5으로 초기화되었다. == 연산자를 사용하는 경우 그러나, 그것은 (5) 둘 다 0x00000005을 포함, 나는 == 연산자를 테스트 라인에 중단 점을 설정하는 경우에도 불구하고, (!=true) false를 반환합니다. 나는 내 코드에 어떤 문제가 있는지 확실하지 않다 :C++ object [implementation] operator == error

class object 
{ 
private: 
    class dummy 
    { 
    public: 
     dummy(){} 
     virtual ~dummy(){} 
     virtual dummy *duplicate() const = 0; 
     virtual const std::type_info &type() const = 0; 
     void *address; 
    }; 
    template < typename _Ty > class data : public dummy 
    { 
     friend class object; 
    public: 
     data(const _Ty &_Value) : __inner(_Value){} 
     ~data(){} 
     const std::type_info &type() const 
     { 
      return typeid(_Ty); 
     } 
     data *duplicate() const 
     { 
      return new data<_Ty>(__inner); 
     } 
    private: 
     _Ty __inner; 
    }; 
    dummy *d; 
public: 
    object() 
    { 
     d->address = NULL; 
    } 
    template < typename _Ty > object(const _Ty &_Value) : d(new data<_Ty>(_Value)) 
    { 
     d->address = reinterpret_cast<void *>(_Value); 
    } 
    object(object &_Rhs) : d(_Rhs.d->duplicate()){} 
    ~object() 
    { 
     if (has_value()) 
     { 
      d->~dummy(); 
     } 
    } 
    const std::type_info &type() const 
    { 
     return d->type(); 
    } 
    template < typename _Ty > _Ty cast() const 
    { 
     if (typeid(_Ty) != type()) 
     { 
      throw std::exception(""); 
     } 
     return reinterpret_cast< data<_Ty> *>(d)->__inner; 
    } 
    const object &operator=(object &_Rhs) 
    { 
     d = _Rhs.d->duplicate(); 
     return *this; 
    } 
    template < typename _Ty > const object &operator=(const _Ty &_Value) const 
    { 
     d = new data<_Ty>(_Value); 
     d->address = reinterpret_cast<void *>(_Value); 
     return *this; 
    } 
    template < typename _Ty > bool operator==(const _Ty &_Value) const 
    { 
     return (type() != typeid(_Ty) ? false : cast<_Ty>() == _Value); 
    } 
    bool operator==(object &_Rhs) const 
    { 
     return (type() != typeid(_Rhs.type()) ? false : d->address == _Rhs.d->address); 
        // Breakpoint tested above ^^^ 
    } 
    template < typename _Ty > bool operator!=(const _Ty &_Value) const 
    { 
     return (type() == typeid(_Ty) ? false : cast<_Ty>() != _Value); 
    } 
    bool operator!=(object &_Rhs) const 
    { 
     return !(*this == _Rhs); 
    } 
    bool has_value() const 
    { 
     return !!d; 
    } 
    bool empty() const 
    { 
     return !d; 
    } 
}; 

int main() 
{ 
    object a = 5, b = 5; 
    std::cout << std::boolalpha 
     << (a == b); 
    getchar(); 
} 
+0

개체 유형은 부스트처럼 날 것으로 보인다 :: 하나를. 당신의 목표는 무엇입니까? 어떤 것과 같은 동적 유형을 구현하거나 고전적인 OOP 슈퍼 루트를 작성 하시겠습니까? – Manu343726

+0

수업이 상당히 엉망입니다. 예를 들어, Object() 이니셜 라이저는 'd-> address = NULL'을 설정하지만 첫 번째 위치에서는 'd'포인터를 초기화하지 않습니다. d = 새 데이터(); 객체의 생성자 및 삭제 D; 오브젝트 소멸자에서 더 틀릴 수도 있습니다. – pscs

+0

@Joseph - 목표가 C++처럼 보이게하거나 자바처럼 작동하도록하지 마십시오. – PaulMcKenzie

답변

2

당신은 오히려 이들의 값보다 'D'회원의 주소 회원을 비교된다. 당신은 그들의 가치를 얻는 어떤 방법이 필요합니다. 아마도 '데이터'파생 클래스가 반환 할 수있는 값을 가져 오기위한 가상 메서드를 만들 수 있습니다.

+0

아니면 적어도'd'가 가리키는'dummy' 클래스의 멤버'주소 '를 비교하고 있습니다. 그러나'address'는 결코 초기화되지 않았기 때문에 어떤 값도 가질 수 있습니다. – sleepy42

+0

몇 가지 조정을했는데 이제 작동합니다. 감사합니다. – Joseph

1

type() != typeid(_Rhs.type()) true를 반환 코드의이 부분. 그래서 오퍼레이터 삼원

(type() != typeid(_Rhs.type()) ? false : d->address == _Rhs.d->address);의 잘못된 부분을 반환한다.

나는> 유형()() _Rhs.type의 유형 ID에 문제가 당신이 this-의 유형 ID를 확인해야합니다 여기 (typeid(type()) != typeid(_Rhs.type())

생각합니다.

편집 : 나는 종류의 방법 바라 보았다. 그것은 단지 당신이 체크해야한다고 생각하기 때문에 타입 ID를 반환합니다.이 타입 -> type()! = _Rhs.type()

0

나는 type 함수를 호출하지 말아야한다고 생각합니다 : 그것은 로컬 객체 그 결과로 정의되지 않은 동작이 일어나 아무 일도 일어나지 않습니다. 그것은 (나는 아주 확실하지 않다) 대신 operator==operator!=에서 typeid(*this)를 사용하는 것이 도움이 될 수 있지만 수업 시간에 더 깨진 것이있다.