我要将提取的数据存到vector 中,但对push_back的应该是对象还是对象指针有点不太清楚
代码如下:
if ( szNodeName == "PointData" )
{
IXMLDOMNode *pXDN3;
pXDN2->get_firstChild(&pXDN3); CTrochoidData szTrochoidData;
//CTrochoidData *lpszCTrochoidData = new CTrochoidData ();while (pXDN3 != NULL)
{
BSTR_NodeName = NULL;
pXDN3->get_nodeName(&BSTR_NodeName);
szNodeName = (CString)BSTR_NodeName;
if ( szNodeName == "WellLength" )
{
pXDN3->get_text(&BSTR_item);
bstr_item = BSTR_item; CString strWellLength = bstr_item.copy();
szTrochoidData.m_fWellLength = _wtof(strWellLength);
}
else if ( szNodeName == "SlantAngle" )
{
pXDN3->get_text(&BSTR_item);
bstr_item = BSTR_item; CString strSlantAngle = bstr_item.copy();
szTrochoidData.m_fSlantAngle = _wtof(strSlantAngle);
}
else if ( szNodeName == "AzimuthAngle" )
{
pXDN3->get_text(&BSTR_item);
bstr_item = BSTR_item; CString strAzimuth = bstr_item.copy();
szTrochoidData.m_fAzimuthAngle = _wtof(strAzimuth);
}
pXDN3->get_nextSibling(&pXDN3);
}
m_trochoidDataVec.push_back(szTrochoidData);
}
vector的定义: vector <CTrochoidData> m_trochoidDataVec; //数据vector 其他代码可以不必理会,只注意下面这三句就可以了,
CTrochoidData szTrochoidData;
//CTrochoidData *lpszCTrochoidData = new CTrochoidData ();
m_trochoidDataVec.push_back(szTrochoidData);
我觉得应该用new出来的对象指针,然后用vector中的元素指向这个空间,当然vector的定义也应该相应改为
vector <CTrochoidData *> m_trochoidDataVec; //数据vector
但我现在适用的是定义对象的方式,而不是对象指针的方式,运行起来也没有错误,
但我觉得这儿应该出错的,因为这个定义的对象是一个局部变量,它的定义处理这个局部定义区间就实效了
不知道我这样认为对不对?
我是想知道为什么没有出错
请指教!
谢谢!
代码如下:
if ( szNodeName == "PointData" )
{
IXMLDOMNode *pXDN3;
pXDN2->get_firstChild(&pXDN3); CTrochoidData szTrochoidData;
//CTrochoidData *lpszCTrochoidData = new CTrochoidData ();while (pXDN3 != NULL)
{
BSTR_NodeName = NULL;
pXDN3->get_nodeName(&BSTR_NodeName);
szNodeName = (CString)BSTR_NodeName;
if ( szNodeName == "WellLength" )
{
pXDN3->get_text(&BSTR_item);
bstr_item = BSTR_item; CString strWellLength = bstr_item.copy();
szTrochoidData.m_fWellLength = _wtof(strWellLength);
}
else if ( szNodeName == "SlantAngle" )
{
pXDN3->get_text(&BSTR_item);
bstr_item = BSTR_item; CString strSlantAngle = bstr_item.copy();
szTrochoidData.m_fSlantAngle = _wtof(strSlantAngle);
}
else if ( szNodeName == "AzimuthAngle" )
{
pXDN3->get_text(&BSTR_item);
bstr_item = BSTR_item; CString strAzimuth = bstr_item.copy();
szTrochoidData.m_fAzimuthAngle = _wtof(strAzimuth);
}
pXDN3->get_nextSibling(&pXDN3);
}
m_trochoidDataVec.push_back(szTrochoidData);
}
vector的定义: vector <CTrochoidData> m_trochoidDataVec; //数据vector 其他代码可以不必理会,只注意下面这三句就可以了,
CTrochoidData szTrochoidData;
//CTrochoidData *lpszCTrochoidData = new CTrochoidData ();
m_trochoidDataVec.push_back(szTrochoidData);
我觉得应该用new出来的对象指针,然后用vector中的元素指向这个空间,当然vector的定义也应该相应改为
vector <CTrochoidData *> m_trochoidDataVec; //数据vector
但我现在适用的是定义对象的方式,而不是对象指针的方式,运行起来也没有错误,
但我觉得这儿应该出错的,因为这个定义的对象是一个局部变量,它的定义处理这个局部定义区间就实效了
不知道我这样认为对不对?
我是想知道为什么没有出错
请指教!
谢谢!
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?
如果是每次push_back都new出来一个对象的存储空间的话,
那使用指针、压入指针时是否申请一个对象的存储空间的内存呢?new指针时已经new出来了一块内存了
CTrochoidData *lpszCTrochoidData = new CTrochoidData ();
m_trochoidDataVec.push_back(lpszCTrochoidData);
我个人觉得push_back是vector的成员函数,所以vector里面存的内容和一般类传值和传指针没什么区别。
另外vector不是每次都分配内存,而是一次分配一大块存储空间,用完了再追加。
因为这时你的vector要这样定义:
vector<CTrochoidData*> m_trochoidDataVec;
即每个元素是1个指针,而不是对象。
指针的拷贝构造,就是普通变量的赋值操作,不会新new出该类的对象。
执行push_back时,该函数会检查if (size() < capacity()),如果成立,则不需要申请新内存,在老内存里使用placement new,即最里面是这个语句:
template<class _T1, class _T2>
void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
{
::new (_Ptr) _T1(_Val);
}
其中_Ptr是那个即将存放这个对象的内存指针,Val是push_back(lpszCTrochoidData)中的lpszCTrochoidData。
相当于执行 ::new (_Ptr) CTrochoidData* (lpszCTrochoidData);