2009-05-19 2 views
0

좋아, 그래서 의심을 가지고, 나는이 가능한 경우 알고 싶어문제 부스트 : 어떤

내가 일반 데이터 (문자열의 int로, 데이터베이스를 사용하고, bools, etc ...). 개체가 생성되거나 개체의 멤버가 수정 될 때마다 특정 작업 (SELECT 또는 UPDATE)을 사용하여 데이터베이스를 쿼리해야합니다. 우선, 이것은 DB 관련 질문이 아니며, 내 진짜 문제는 boost :: any를 보유하고있는 ptr_vector가 객체의 멤버에 대한 포인터라는 것입니다. 이 같은 코드 뭔가 :

class Enemy{ 
    private: 
    //some private data... 
    public: 
    auto_ptr<int> ID_Enemy; 
    auto_ptr<string> Enemy_Name; 
    //miscellaneous methods... 
}; 

그때 나는 회원이 내가 인수로 부스트 소요 다른 기타 클래스 : 어떤 *의 기능을 수정할 통과 :

misc_class.addValues((boost::any*)(ID_Enemy.get())); 
misc_class.addValues((boost::any*)(Enemy_Name.get())); 

같은 클래스 any *를 받아들이고 다음을 수행합니다.

auto_ptr<boost::any> val2(val); //being val, the passed any* 
Enemy_Values.push_back(val2); 

Enemy_Values는 ptr_vector입니다.

misc_class.Enemy_Values[0] = (boost::any)(69); 

그리고 여기, 내가 위반 오류가 : 내가 구성원으로 Enemy_Values을 가지고이 misc_class 액세스 할 때, 나는 내부 auto_ptr은이 가리키는되는 값을 변경하고 싶습니다. 나는 많은 것을 시도해 보았고 어떤 사람은 auto_ptr의 컨테이너를 사용하거나 boost :: any를 사용하여 앞뒤로 변환하면 안된다고 말했다. 이것이 내가 할 수있는 일입니까, 아니면 더 좋고 직관적 인 방식입니까?

미리 감사드립니다.

답변

3

(boost::any*)(ID_Enemy.get())은 관련없는 포인터 유형을 캐스팅하므로 reinterpret_cast을 수행합니다. 즉, 실제로는 정수를 가리키는 any에 대한 유효하지 않은 포인터를 가져옵니다. 대신, addValues을 참조하여 임시 부스트 : 어떤 객체를 생성하고 전달할 :

misc_class.addValues(boost::any(ID_Enemy.get()); 

auto_ptr의 사용은 사실 잘못된 : auto_ptr가 freestore에 객체를 삭제하지만, 여기에 우리가 대신 지역 주민 상대하고 .

Enemy_Values.push_back(val); 

을 ... 그리고 Enemy_Values ​​그냥 표준 : : 벡터해야한다 : addValues 단지 벡터에 any 개체의 를 밀어해야합니다.

은 ptr_vector 및 freestore가 할당 한 boost::any 개체를 사용하여 처리하지만 이는 필요 이상으로 복잡합니다.

0

auto_ptr은 number of problems입니다. 이미 부스트를 사용하고 있으므로 boost :: shared_ptr을 사용하지 않으시겠습니까?