2012-03-08 4 views
0

포인터로 반환되는 불변의 문자열 클래스가 있습니다 (null 일 수 있습니다).연산자를 오버로드 할 수 있도록 포인터 래퍼가 필요합니까?

오버로드하려면 ImmutableString* == const char* 싶었습니다. 그러나 그것은 왼쪽 매개 변수가 포인터이고 포인터가 아닌 포인터 여야하므로 필자가 볼 수 없습니다. 이 함수는 null 멤버를 비교 처리합니다. 그냥 오버로드 할 수 없습니다.

포인터 오버랩을 사용할 수 있도록 포인터 랩퍼를 사용할 수 있습니까? 바람직하게는 표준 것. 나는 내 자신을 쉽게 쓸 수 있다고 생각하지만 내 직감은 부스트 ​​또는 스트립에 하나가 있다고 말합니다.

+1

못생긴 디자인을 스크랩하고 포인터에서 멀리 떨어져 있습니까? –

+0

@CatPlusPlus : 할 수 없습니다. C 및 void * 콜백을 사용하고 있습니다. 어떤 곳에서는 참조를 만들 수 있지만 ref는 null이 될 수 없습니다. –

+0

함수에서'ImmutableString * '을 반환하면 누가 그것을 파기해야합니까? – fredoverflow

답변

0

음 ... 스마트 포인터? std::auto_ptr 또는 std::shared_ptr

왜 그런 두 포인터를 비교할 것입니까? 그것이 올바른 방법을 좋아하는 것 같아 ImmutableString::operator == (const char*) 구현하고 포인터 대신 개체를 사용하는 것입니다.

ImmutableString* is = foo(); 
(*is) == "whatever" 
+0

'std :: auto_ptr'는 많은 의미 상 문제로 인해 사용되지 않습니다. 그것은'shared_ptr','unique_ptr','weak_ptr'로 대체되었습니다. 이들이 없다면 std :: tr1 또는 tr1 :: namespaces를 시도하십시오. 그것들조차도 아니라면 부스트를 사용하십시오. –

+0

이 접근법의 문제점은 벡터에서 find()를 사용할 때 string이 ptr이 아닌 문자열 equality와 비교 될 때 찾을 수 없다는 것입니다. –

+0

@ acidzombie24 : ... * 원하는 것은 *해야합니다. 하나는 일반적으로 "문자열에 대한 포인터"를 마치 "문자열"인 것처럼 취급해서는 안됩니다. 그런 방식으로'find '를 사용할 수 있도록 해킹을하면 다른 곳에서는 의미 적 악몽을 만들 가치가 없습니다. 특히 해킹없이'find_if' 만 사용할 수 있습니다. (또는 가능한 경우 포인터 대신 벡터에 값을 저장하십시오.) – Hurkyl

1

표준 래퍼를 모르지만 처음부터 쓰는 것이 너무 어렵지 않아야합니다.

class WrappedImmutableString { 
private: 
    ImmutableString *value; 
public: 
    WrappedImmutableString(ImmutableString *value): value(value); 
    char operator*() const { return value; } // dereference operator 
    bool operator==(const char *other) {...} 
    void delete() { delete value; } 
}; 

을하지만 ") (myImmutableString.delete"와 "myImmutableString 삭제"교체해야하는 것주의 : 아주 간단한 하나는 다음과 같이 보일 것입니다.

내가 말하고자하는 것은 아마도 입니다. 나쁜 아이디어.

+1

'delete'는 키워드입니다. 소멸자가 뭐가 잘못 되었나요? –

+0

@ R.MartinhoFernandes의 말. 또한이 코드는 매우 나쁜 것으로 나타났습니다. Theres 언급 없음 -> 및 *이 isnt 템플릿. Theres 아니오 ==도 ==. 삭제가 잘못되어'public :'을 제외한 모든 행을 여기서 재사용 할 수는 없습니다. +0. 이것은 코멘트 였을 것입니다. 또한 나쁜 생각은 아닙니다. std :: strings는 ==를 통해 비교할 수 있지만 본인이 원하는 것은 내 자신의 경량 클래스를 사용합니다. –

+0

나는 래퍼가 필요 없다는 것에도 적당한 확률을 붙일 것이다. "ImmutableString"은 이미이 목적에 적합하다 (또는 쉽게 변형 될 수있다). 그리고 포인터 대신 포인터를 반환하는 함수를 반환 할 수있다. 그들. – Hurkyl

관련 문제