2012-09-28 40 views
2

我一直在为我的一个项目学习C++。目前,我正在考虑使用指向类的指针向量(我将填充从此基类派生的类),因为我想访问每个派生类所特有的唯一函数。我不完全相信如何去使用它,并从我的经验与正常矢量,我明白如何可以是一个痛苦的屁股工作,所以我只想知道几件事情:矢量的指针。如何使用?

  1. 如何添加一个对象到矢量?

  2. 如何删除矢量中的单个元素?

  3. 如何通过迭代器访问特定对象?例如,如何访问向量中具有指针的对象的函数?

  4. 如何将一个迭代器传递给一个将指针指向一个对象的函数作为参数?

还有什么我应该知道的吗?

+0

提示:使用智能指针而不是原始指针的向量。前两个问题可以通过std :: vector引用轻松回答,第三个问题可以在随机访问迭代器(它是矢量使用的那个)上引用。学习如何使用引用是编程中的一大帮助。 – chris

回答

1

实施例的设置,

class Base 
{ 
}; 

class DerivedOne : public Base 
{ 
}; 

class DerivedTwo : public Base 
{ 
}; 

std::vector<Base*> ptrVec; 

添加

ptrVec.push_back(new DerivedOne()); 
ptrVec.push_back(new DerivedTwo()); 

删除

std::vector<Base*>::iterator it; 
/* Make sure it points to the correct element. */ 
delete *it; 
ptrVec.erase(it); 

访问一个功能易,

Base* ptrToObj = *it; // Assuming it points to the correct element 
ptrToObj->AnyFunc(); // You can also use (*it)->AnyFunc() 

回答你4问题

AnyFuncThatAcceptsObjPtr(*it); // Again assuming it points to the correct element 

也就是还有什么我应该知道的?

是的,了解smart pointers

std::vector<SomeSmartPtr<Base> > smartPtrVec; 

SomeSmartPtr<Base> smartPtr(new DerivedOne()); 
smartPtrVec.push_back(smartPtr); 

smartPtrVec.erase(it); // With smart pointers, you don't need to delete explicitly 
+3

如果您要建议/倡导使用指针作为容器元素,至少建议使用智能指针而不是原始指针。 –