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


[问题]:

    我的目的是创建一个不同类型对象的容器。首先从同一个类派生了所有需要的类,然后将它们压入容器中。请看下列代码: 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销毁分配的对象。
字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z