【问题标题】:C++ Iterators, interfaces and pointersC++ 迭代器、接口和指针
【发布时间】:2011-05-22 10:19:29
【问题描述】:

我正在尝试将 c++ 迭代器与接口一起使用,但无法使其正常工作。

我有点不知道为矢量内容选择什么类型。这需要是一个指针吗?我必须做一个“新的实施()”吗?简而言之,我不清楚,也找不到有用的例子。

这里是接口和实现(.h 文件)。

class Interface{
public:
virtual int method() = 0;
};

class Implementation1 : public Interface{
    public:
    int method(); 
};

class Implementation2 : public Interface{
    public:
    int method();
};

.cpp 文件:

#include "content.h"

int Implementation1::method(){
    return 1;
}

int Implementation2::method(){
    return 2;
}

还有我的主要功能:

#include "content.h"
#include <vector>
#include <iostream>

using namespace std;

int main(void)
{
    // create the vector and put elements in it
    vector<Interface*> elements;
    elements.push_back(new Implementation1());
    elements.push_back(new Implementation1());
    elements.push_back(new Implementation2());

    // now iterate on them

    vector<Interface*>::iterator iterator;
    for(iterator = elements.begin(); iterator != elements.end(); ++iterator ){
        *iterator->method();
    }

    return 1;
}

编译器正在输出:

main.cpp:在函数“int main()”中: main.cpp:19:错误:请求成员 ‘*’中的‘方法’ iterator.__gnu_cxx::__normal_iterator<_iterator _container>::operator-> with _Iterator = Interface**, _Container = std::vector >', 属于非类类型 ‘接口*’

知道我在这里做错了什么吗?

【问题讨论】:

  • “不工作”是什么意思?
  • 编译失败,是的。我已经添加了 g++ 的输出。

标签: c++ interface vector iterator


【解决方案1】:

*iterator-&gt;method(); 更改为(*iterator)-&gt;method();

前者取消了iterator->method() 的返回值。接口*没有方法(),它什么都没有。

您想取消引用迭代器以获取您的指针,然后取消引用 IT。

你基本上和迭代器**一样,所以采取相应的行动。

【讨论】:

  • 详细说明:-&gt; 优先于*,同样2 * 2 + 2 中的* 的优先级高于+
【解决方案2】:

+1 for Noah 关于迭代器的编译错误,这是一个很好的解释。至于你之前的问题:

我有点不知道为矢量内容选择什么类型。这需要是一个指针吗?我必须做一个“新的实施()”吗?

是的,这必须是一个指针。原因很简单:类型 T 的向量只存储(并拥有)类型 T 的元素,而不是子类型 - 这有充分的理由(如果子类有不同的大小怎么办?)。

因此,您必须将对象存储在某处并将指针保存在向量中。事实上,通过operator new 将它们存储在免费商店是最简单的选择。

如果你想让你的生活更轻松一点,你可以使用boost::ptr_vector 来满足你的目的。

【讨论】:

  • 您也可以使用智能指针。例如,根据您的需要,您可以使用vector&lt;unique_ptr&lt;T&gt;&gt;。只是不要使用 auto_ptr 或 scoped_ptr;它们可能看起来有效,但不是合法的矢量内容。
  • 同意(但这仍然是 c++0x,所以ptr_vector 是我的第一推荐 ATM)。
【解决方案3】:

试试(*iterator)-&gt;method();

【讨论】:

    【解决方案4】:

    您所做的事情本身并没有什么无效的,但是创建原始指针向量通常是一个坏主意,您应该使用像 shared_ptr 这样的所有权强制指针(“智能”指针)。而且您也不需要取消引用迭代器,它应该直接提供 ->method() 。但是,除了可能是您的 *iterator-&gt;method() 之外,我没有看到任何直接无法使用此代码编译的内容,因为上次我检查取消引用的优先级非常低,您可能正在执行无法编译的 *(iterator-&gt;method())

    【讨论】:

    • 虽然关于有一个原始指针向量在易错性方面是次优的评论(与智能指针向量相比)是正确的,但这表明它所在的位置是一个引用计数的智能指针不需要是不酷的(并且在效率方面不是最佳的,这仍然很糟糕)。有更好的解决方案:boost::ptr_vector 或智能指针的普通向量,如 unique_ptr (c++0x)。
    猜你喜欢
    • 2012-02-27
    • 2012-01-28
    • 2014-12-05
    • 2014-10-13
    • 2012-11-07
    • 2014-08-13
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多