나는 boost::ptr_vector
을 사용하고 있지만, 이는 표준 std::vector
에도 적용된다고 생각합니다. 내가 polymophically boost::ptr_vector
계층에 개체에 대한 포인터를 배치 시도하고 내가 Object
에서 상속 Entity
이 라인을 작성하는 가지고있다포인터의 다형성
Object * newObject = new Entity(param1, param2); // then I attempt to add it to the ptr_vector
하지만 난 볼 수있는 프로그램 (비주얼 스튜디오 2010)을 어기면 보유하고있는 것은 쓰레기에서 결코 방향 전환되지 않으며 쓰레기가 열리고 있습니다. 코드를 단계별로 실행하고 매개 변수화 된 생성자를 입력 한 다음 올바른 논리 단계를 따릅니다.
나는 무엇이 잘못 될지 불확실합니다. 이 다형성 동작이 작동하려면 부모 또는 자식에 특정 멤버 함수가 있어야합니다 (현재 모든 자식에는 유형에 고유 한 매개 변수화 된 생성자가 있고 다형 상호 작용 메소드와 함께 소멸자가 있습니다). 할당 연산자가 있어야합니까, 아니면 Object
클래스의 생성자를 사용해야합니까?
연산자 new
에 대한 호출이 개체로 확인되지 않고 다른 것으로 해결되지만 VS2010에서 오류가 발생하지 않는 것으로 보입니다.
편집 : 일어날 일에 대한 설명. 객체를 결정 case/switch
를 사용
생성 한 객체를 생성하는
포인터 구조에 추가하고, 새로 할당 할 (직사각형/비 들쭉날쭉) 2D std::vector
// I 단계별
문제는 카메라 스터드 관리자 부재 boost::ptr_vector
으로 푸시 그 포인터의 참조를
일어나는 곳이다 생각 io 2010 포인터를 만들기 위해 줄을 끊고 포인터를보고boost::ptr_vector
에
push_back()
줄에 새 (다형성)와 줄을 할당합니다. 임시 포인터 값이 생성되고 생성자로 이동하면 해당 생성자에 대한 모든 논리적 단계를 따르고 생성자가 완료되면 스택이 생성자를 호출 한 행으로 돌아갑니다. 포인터는 여전히 동일한 값입니다 (이 값은 받아 들일 수는 있지만) 객체를 보면 모든 값을 물음표 (정적으로 구성된 멤버 객체 포함)로 표시합니다. 그런 다음 푸시 백이 트리거되고 부스트 헤더에 들어가면
x
값은 동일한 정보를 표시합니다.
포인터가 만들어진 것처럼 보이고 개체의 데이터가 만들어 지지만 일단 생성자가 끝나면 실제로 부모 클래스 개체에 값을 할당하지 않습니다.이 개체는 상당히 간단해야합니다. 다형 성 행동.우려의
예를 들어 헤더 (실제 헤더는 멤버 변수를해야합니까, 그 구현은 별도의 cpp 파일에있는) :
class Object{
public :
virtual void interact(int action, Object& source){}
virtual void updateObject(float duration){}
virtual ~Object(){}
bool operator==(const Object& _other)const;
bool operator!=(const Object& _other)const;
};
class Entity : public Object{
public:
Entity(Vector3 location, Type thisType, SpecialType difficulty=noSpecial);
~Entity();
void interact(int action, Object& source);
void updateObject(float duration);
};
편집 : 손 나은 대상 문제에 대한 컨텍스트를 변경, 솔루션을 받으십시오
벡터를 채우는 방식을 표시 할 수 있습니까? – Naveen
@naveen 나는 그것과 관련 있다고 생각하지 않는다. 벡터를 채우지 만, 실제로 생성되는 객체를 가져 와서 첫 번째 위치에 포인터에 할당합니다. – gardian06
이것은 아마도 어리석은 질문이지만, 경우에 따라 ... 최적화되지 않은 디버그 빌드를 디버깅하고 있습니까? 릴리즈 빌드에서는 컴파일러가 모든 중간 복사본을 건너 뛰고 포인터를 일부 레지스터에두고 벡터의 저장 공간이 될 때까지 메모리의 어느 위치에도 저장하지 않을 가능성이 높습니다. 디버거는 newObject, x 등을 보려고 할 때마다 그 레지스터의 내용을 보여줌으로써이를 처리 할 수 있지만, 포인터에 대해 가비지를 표시하거나 아무것도 표시하지 않음으로써 쉽게 처리 할 수 있습니다. – abarnert