Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2096230
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 21:37:30

一起学习
在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 MyVector;

 vector::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销毁分配的对象。 下载本文示例代码


赵湘宁赵湘宁赵湘宁赵湘宁赵湘宁赵湘宁赵湘宁赵湘宁赵湘宁赵湘宁赵湘宁赵湘宁
阅读(305) | 评论(0) | 转发(0) |
0

上一篇:赵湘宁

下一篇:赵湘宁

给主人留下些什么吧!~~