【问题标题】:Typcasting vector<object> in C++?在 C++ 中输入向量<object>?
【发布时间】: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

标签: c++ inheritance casting


【解决方案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)或智能指针容器。
    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多