在 C++ 中输入向量<object>?

Posted

技术标签:

【中文标题】在 C++ 中输入向量<object>?【英文标题】:Typcasting vector<object> in C++? 【发布时间】:2010-10-30 13:35:47 【问题描述】:

我有两个类,障碍物和boid,boid继承自障碍物。

现在我想编写一些函数可以处理这两个类的对象,这样传递vector&lt;boid&gt; 的效果就和vector&lt;obstacle&gt; 一样好。

当我像这样进行类型转换并尝试访问向量的大小时,我得到的数字是 1840700394 而不是 60:

vector<boid>* boids; ....
cout << ((vector<obstacle>*)boids)->size() << endl;

我也尝试过“reinterpret_cast”但同样的问题。

【问题讨论】:

你为什么使用std::vector&lt;&gt; 指针?这对于您显示的这段代码没有意义,并表明您在 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&lt;class T&gt; void f(T x) 为您提供void f(int x)void f(char x)void f(std::string x),无穷无尽。【参考方案3】:

解决此类问题的一种简单方法是使用std::vector&lt;obstacle *&gt;。然后你可以用指向任何继承自障碍物的对象的指针填充你的向量。

【讨论】:

不要这样做;而是使用智能指针容器(例如 boost::ptr_vector)或智能指针容器。

以上是关于在 C++ 中输入向量<object>?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中重塑二维向量

调用 C++ 向量的每个元素的成员函数

如何在 C++ 中将输入正确读入 2D 向量 vector<vector<int>>

C++中的指针和向量

如何在c ++中检索向量内的对象

在向量循环 C++ 中终止字符串输入