2011-02-23 5 views
3

참조 또는 포인터를 사용하는 작문?

내가이

class Shape 
{ 
public: 
    virtual void Display() 
    { 
     cout << "Shape::Display()" << endl; 
    } 
}; 

class Line : public Shape 
{ 
public: 
    void Display() 
    { 
     cout << "Line::Display()" << endl; 
    } 
}; 

class Circle : public Shape 
{ 
public: 
    void Display() 
    { 
     cout << "Circle::Display()" << endl; 
    } 
}; 

1과 같은 클래스) 여기

class Container 
{ 
public: 
    Container(Shape& shape) : m_Shape(shape) 
    { 

    } 

    void Draw() 
    { 
     m_Shape.Display(); 
    } 
private: 
    Shape& m_Shape; 
}; 

그는 참조를 복용하고 기본 클래스 객체에 할당되어있는 고려 나 하나가 선한 알려주세요 .

2) 여기

class ShapeContainer 
{ 
public: 
    ShapeContainer(Shape* pShape) : m_pShape(pShape) 
    { 

    } 
    void Draw() 
    { 
     m_pShape->Display(); 
    } 

private: 
     Shape* m_pShape; 
}; 

그는 포인터를 복용하고 기본 클래스 객체에 할당된다.

내가 perosnally 가능한 포인터를 통해 참조를 사용하여 선호하는 그들에게

+1

참조를 사용하면 기본적으로 '컨테이너'인스턴스를 복사 할 수 없으므로 원하는 의미에 따라 문제가 될 수 있습니다. – ereOn

답변

7

귀하의 개체로 무엇을하고 싶은지에 대한 결정을 내려야합니다. 값을 저장하는 옵션을 포함하지 않으므로 외부 객체를 참조하기 위해 컨테이너가 필요하다고 가정합니다. 이것이 요구 사항이 아닌 경우, 표준 컨테이너가 사용하는 것을 고려하십시오 : 오브젝트 사본을 저장하십시오.

참조를 사용하면 생성 후 NULL을 확인하지 않아도됩니다 (생성 후 두 솔루션 모두 동일한 문제가 공유됩니다. 외부 객체가 파괴되어 매달린 참조 및 정의되지 않은 동작이 남김). 참조의 의미가 조금 더 강해지고 코드를 읽는 사람은 즉시 이해할 수 있습니다. 이 컨테이너는 컨테이너의 전체 수명 동안이 객체에 대한 참조를 보유하기위한 것이고 객체 수명은 외부에서으로 관리됩니다.

부정적인면에서는 참조를 재설정 할 수 없으며 일단 참조를 설정하면 객체의 별칭이되고 다른 객체를 참조하도록 재설정 할 수 없습니다. 즉, 참조를 보유한 컨테이너는 다른 객체를 참조 할 수 없으므로 기본적으로 할당 할 수 없습니다. 사용자 지정 할당 연산자를 제공하더라도 참조를 변경할 수 없으며 이전 객체를 계속 참조합니다. 다른 객체를 참조하는 컨테이너의 멤버 함수를 제공 할 수 없습니다. 참조를 설정하면 영원히 설정됩니다.

포인터는 NULL이 될 수 있으므로 사용하기 전에 포인터의 유효성을 확인하고 싶을 수도 있습니다. 그것들은 재설정이 가능하고 언제든지 컨테이너가 다른 객체를 참조하도록 오퍼레이션을 제공 할 수 있습니다. 기본적으로 컨테이너는 할당 가능합니다. 부정적인면에서 포인터는 다른 시나리오에서 사용될 수 있으므로 의미가 분명하지 않습니다. 특히, 컨테이너가 포인터의 소유권 (그리고 메모리를 해제 할 책임)을 취하는 지 여부를 인터페이스에서 신중하게 문서화해야합니다. 컨테이너 내부에서 소유권을 처리하려는 경우 스마트 포인터를 사용하는 것을 고려하십시오 (아니면 가능한 경우 원본을 잊어 버리면 에러가 발생하지 않을 것입니다).

1

를 사용하는 경우 나 하나가 잘 알거나 주시기 바랍니다. 이것은 참조가 NULL 일 수 없으므로 포인터를 사용하기 전에 NULL 검사를하지 않아도됩니다. 현재 shape 클래스에는 가상 소멸자가 필요합니다.

+0

+1에 대한 소유권 및 스마트 포인터에 대한 문장을 추가하십시오. –

0

컨테이너 클래스에서 포함 된 개체의 수명을 명시 적으로 제어 할 필요가없고 전달 된 참조 개체가 컨테이너 클래스의 수명 기간 동안 항상 유효하다는 것을 확신 할 수 있으면 참조 방법을 사용합니다.

1

나는이 경우 좋거나 나쁘지 않다고 말하고 싶은데, 그것은 단지 당신이하고 싶은 일의 문제 일뿐입니다. 사용자가 벡터에 NULL 포인터를 저장하는 것이 허용되지 않아서 필요하다면 참조로 사용하십시오. 그러나 사용자가 10 개의 객체에 대한 공간을 예약하려고하지만 첫 번째 객체 만 초기화하려는 경우 객체와 빈 공간을 구별 할 수 있도록 NULL을 저장할 수 있어야합니다.

하지만이 말은 컨테이너에 대한 요구 사항입니다.

귀하의 경우에는 참조로 선택하겠습니다.

관련 문제