在 C++ 中输入向量<object>?
Posted
技术标签:
【中文标题】在 C++ 中输入向量<object>?【英文标题】:Typcasting vector<object> in C++? 【发布时间】:2010-10-30 13:35:47 【问题描述】:我有两个类,障碍物和boid,boid继承自障碍物。
现在我想编写一些函数可以处理这两个类的对象,这样传递vector<boid>
的效果就和vector<obstacle>
一样好。
当我像这样进行类型转换并尝试访问向量的大小时,我得到的数字是 1840700394 而不是 60:
vector<boid>* boids; ....
cout << ((vector<obstacle>*)boids)->size() << endl;
我也尝试过“reinterpret_cast”但同样的问题。
【问题讨论】:
你为什么使用std::vector<>
指针?这对于您显示的这段代码没有意义,并表明您在 C++ 中缺少很多关于对象生命周期的信息。你可能需要a good C++ book。
【参考方案1】:
C++ 模板与 C# 和 Java 泛型不同。模板实例化是一个完整的类,并且与其他模板实例化没有任何关系。不能在它们之间施放。
(旁注:如果您使用的是static_cast
,它会为您发现这个......)
【讨论】:
【参考方案2】:您不能像这样将向量转换为不同类型的向量。如果您需要一个适用于这两种类型对象的通用函数,您可以使用函数模板。
template <typename T>
void func(const std::vector<T>& vec)
....
此函数将接受包含任何类型对象的向量。
另外,请参阅下面 Roger Pate 的评论。您可以让函数接受任何类型的容器(或任何实现适当语义的对象),只需说:
template <typename T>
void func(const T& container) ...
【讨论】:
更好的是,让整个容器成为模板参数。 或者传递一个范围而不是一个容器? @eq-: 有时候你真的需要容器;例如调用擦除或其他方法。 如果不阅读有关“模板”的所有内容,我可以想象使用模板时无法访问对象的成员? @Jan:可以访问会员。简而言之,模板只是编译器为您执行的代码生成,因此template<class T> void f(T x)
为您提供void f(int x)
、void f(char x)
、void f(std::string x)
,无穷无尽。【参考方案3】:
解决此类问题的一种简单方法是使用std::vector<obstacle *>
。然后你可以用指向任何继承自障碍物的对象的指针填充你的向量。
【讨论】:
不要这样做;而是使用智能指针容器(例如 boost::ptr_vector)或智能指针容器。以上是关于在 C++ 中输入向量<object>?的主要内容,如果未能解决你的问题,请参考以下文章