shared_ptr 사용중 자료구조(vector) 관련 문제...
글쓴이: dorado2 / 작성시간: 목, 2005/07/07 - 10:33오후
기존에 사용하던 코드 대신에 boost::shared_ptr 을 써서
자료구조를 다시 정의해서 쓰려고 하고 있습니다.
#include <vector>
#include <iostream>
#include <boost/variant.hpp>
#include <boost/smart_ptr.hpp>
class NP;
enum NPType { ADDR_NP, ROUTER_ADDR_NP };
typedef boost::shared_ptr<NP> NPPtr; // NP 클래스의 포인터 타입을 boost::shared_ptr 을 이용해서 사용
typedef std::vector<NPPtr> CNPObList; // NPPtr 타입을 담는 vector 정의
// boost::variant 를 이용해서 여러 가지 데이터 타입을 담을 수 있는 타입 선언
typedef boost::variant<bool, unsigned char, signed char, unsigned short, signed short, unsigned int, signed int, float> varType;
typedef std::vector<varType> NPDATA;
class SimpleNode{
public:
SimpleNode();
SimpleNode(const SimpleNode &); // copy constructor
virtual ~SimpleNode();
protected:
CNPObList NPList;
public:
void InitNP();
void ResetNP();
CNPObList getNPList() {return NPList;};
}
class NP{
public:
NP();
NP(const NP &);
NP(NPType npType, unsigned short nId, unsigned char nTp, unsigned short nL, NPDATA nData);
virtual ~NP();
unsigned short getNpIndex() const {return npIndex; };
private:
NPType n_DefNPType;
CString NPName;
unsigned short npIndex;
unsigned char npType;
unsigned short npArrayLength;
NPDATA npData;
};
뭐 간단히 추려보면 대략 위와 같은 형태로 선언을 해서 쓰고 있구요. SimpleNode class안에 CNPObList 변수를 선언해서 사용합니다. 그런데, 초기화 코드안에서 CNPObList 변수인 NPList 내에 특정 값들(NP 클래스)를 넣어주어야 합니다. 그 코드는 아래와 같구요.
void SimpleNode::InitNP()
{
if( getNPList().empty() == true)
{
NPDATA nData;
varType a;
// Addr NP
a = (unsigned char)0x00;
nData.push_back(a);
nData.push_back(a);
NPPtr p(new NP(ADDR_NP, 0x4000, NP_UNSIGNED | NP_CHAR, 2, nData)); NPList.push_back(p);
nData.clear();
a = (unsigned char)0x00;
nData.push_back(a);
p.reset(new NP(ROUTER_ADDR_NP, 0x4001, NP_UNSIGNED | NP_CHAR, 1, nData));
NPList.push_back(p); // 이건 들어감
....
getNPList().push_back(p); // 이러면 안 들어감
CNPObList tmp = getNPList();
tmp.push_back(p); // 이것도 역시 안 들어감
NPPtr c = getNPList().at(0); // 데이터 읽어오는 것은 가능함
unsigned short b = c->getNpIndex();
}
}
문제는 위에서 보듯이 NPList를 바로 써서 NPList.push_back(p)라고 해주면 vector에 바로 들어가는데,
getNPList().push_back(p) 이런 식으로 getNPList()를 통해 얻어온 vector에는 NPPtr 타입인 p가 제대로 들어가지 않는 문제가 생깁니다. 저로서는 이해가 잘 안 되는데요.
반면 위 코드 마지막 부분에서 보듯이, 데이터를 읽어올 때는 getNPList() 도 동작이 됩니다.
getNPList() 함수가 const도 아닌데, 왜 저런지 모르겠네요.
비슷한 문제가 다른데서도 발생합니다.
void SimpleNode::ResetNP()
{
int size;
getNPList().clear();
size = getNPList().size();
NPList.clear();
size = NPList.size();
}
단순히 NPList vector에 담긴 element를 모두 지우는 부분인데요.
getNPList().clear() 하면 내용이 지워지질 않습니다. 즉 size가 0이 아니라 그대로입니다.
반면 NPList.clear()은 잘 동작하는군요.
어떤 것이 이유가 될 수 있을지요?
Forums:


[code:1]CNPObList getNPList() &#
CNPObList getNPList() {return NPList;};이것 때문에 그렇습니다. getNPList()가 반환하는 것은 this->NPList의 복사본입니다. 복사본에 push_back()을 해도 this->NPList에는 아무 변화가 없게 되지요. 참조형으로 반환하면 됩니다.감사드립니다.
어이쿠, 이런.... :oops:
간단한 실수를...
답변 감사드려요.
댓글 달기