WEB开发网
开发学院软件开发VC 在STL列表(Lists)中插入不同类型的对象 阅读

在STL列表(Lists)中插入不同类型的对象

 2010-07-15 20:44:12 来源:WEB开发网   
核心提示:现在将这些类压入向量列表,synObject * pMyObject;pMyObject = new synObject;synPin * pMyPin;pMyPin = new synPin;(*pMyPin).SetPin("myPin");synCell * pMyCell;pMyCell =

现在将这些类压入向量列表。

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 

Tags:STL 列表 Lists

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接