程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 在STL列表(Lists)中插入不同類型的對象

在STL列表(Lists)中插入不同類型的對象

編輯:關於VC++

[問題]:

我的目的是創建一個不同類型對象的容器。首先從同一個類派生了所有需要的類,然後將它們壓入容器中。請看下列代碼: synObject為基類,synPin 和 synPin 是從基類中派生的子類,class synObject {
public :
synObject();
string GetClass();
string className;
};
synObject::synObject()
{
className = "synObject";
}
string synObject::GetClass()
{
return className;
}
class synPin : public synObject {
string pin;
public :
synPin();
void  SetPin(string Pin);
string GetPin();
private:
};
synPin::synPin()
{
className = "synPin";
}
void synPin::SetPin(string Pin)
{
pin = Pin;
}
string synPin::GetPin()
{
return pin;
}
class synCell : public synObject {
string cell;
public :
synCell();
void  SetCell(string Cell);
string GetCell();
private:
};
synCell::synCell()
{
className = "synCell";
}
void synCell::SetCell(string Cell)
{
cell = Cell;
}
string synCell::GetCell()
{
return cell;
}

現在將這些類壓入向量列表。

synObject * pMyObject;
pMyObject = new synObject;
synPin * pMyPin;
pMyPin = new synPin;
(*pMyPin).SetPin("myPin");
synCell * pMyCell;
pMyCell = new synCell;
(*pMyCell).SetCell("myCell");
vector<synObject *> MyVector;
vector<synObject *>::iterator ThisVector;
MyVector.empty();
MyVector.push_back(pMyObject);
MyVector.push_back(pMyPin);
MyVector.push_back(pMyCell);

當遍歷向量時,我只能訪問公共的(基類)方法:不能訪問派生的方法。

for ( ThisVector = MyVector.begin(); 
    ThisVector != MyVector.end();
    ThisVector++
   )
{
 cout << (**ThisVector).GetClass() << endl ;
 if ( (**ThisVector).GetClass().compare("synClass") == 0) {
  cout << (**ThisVector).GetCell() << endl ;
 }
 if ( (**ThisVector).GetClass().compare("synPin") == 0) {
  cout << (**ThisVector).GetPin() << endl ;
 }
}

[解答]:

為了實現動態綁定,你需要使用基類的地址或指針。如果你使用的是一個基類指針,就不要用“.”符號來訪問成員函數,而要用“->”,也就是說用    pMyCell->SetCell("myCell");代替    (*pMyCell).SetCell("myCell");更重要的是,不要使用迭代器訪問向量元素,而要使用重載的“[]”操作符vector < synObject * >::iterator ThisVector= MyVector.begin();
for (int i =0; ThisVector!=MyVector.end(); ++i)
{
 cout << MyVector[i]->GetClass();
}

另外,我對你的代碼有一些風格上的建議,這很重要:

首先,我注意到你的類沒有聲明任何虛擬成員,甚至連虛析構器都沒有,這有可能導致未定義的行為。這使我懷疑使用繼承特性的意義。此外,你不應該用傳值的方式從成員函數返回串對象。而是應該返回常量數據的地址。

其次,記住要用delete銷毀分配的對象。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved