通过[]运算符返回向量元素引用

时间:2014-04-21 14:23:34

标签: c++ pointers vector

我有一个类或结构,比方说, Container ,具有以下结构:

template <typename type> struct Container {
    vector <type *> v;
    ...
    functions
    ...
    type* operator[] (int i) { // not sure about this
          return (v)[i];
    }
};

其中type可以是标准类型或自定义类或结构。

这个结构应该像这样工作:

Container<type> * c(10);
c->function(); // calls a function that iterates over the elements of v

如果我想访问向量的各个元素,我可以调用

c->v[0]->function()

其中function是 type 类的成员; 这有点像预期的;但是,它可以简化为

c[0]->function()

由于我定义的[]运算符,返回指向包含类的指针而不是容器本身,但编译器仍然抱怨容器类没有名为&#的成员34;功能&#34 ;. 这不是一个大问题,可以通过不同的语法轻松避免,但让我觉得我对指针和引用如何工作有一些基本的误解。 在这里定义[]运算符的正确方法是什么?我错过了什么? 提前谢谢

编辑:我编辑了问题以反映我的实际代码

1 个答案:

答案 0 :(得分:0)

您的operator[]似乎没问题。你的结构名称后似乎缺少一个分号。

  
    

是。编译器告诉我Container没有成员函数,而不是类型。

  

您是否为Container定义了一个函数?

这是一个编译的工作示例:

#include <iostream>
#include <vector>

struct A
{
    void Function () {
        std::cout << "A::Function()" "\n" ;
    }
};

template <typename type> struct Container {
    std::vector <type *> v;

    void Function () {
        std::cout << "Container::Function ()" "\n" ;
    }

    type* operator[] (int i) { 
          return (v)[i];
    }
};

int main (void)
{
    A a ;

    Container <A> c ;

    c.Function () ;

    c.v.push_back (&a) ;
    c[0]->Function () ;

    return 0 ;
}

输出:

  
    

Container :: Function()
    A ::功能()

  

<强>更新

以下是使用指针的示例。

int main (void)
{
    A a ;

    Container <A> *pC = new Container <A> ;

    pC->Function () ;

    pC->v.push_back (&a) ;
    (*pC) [0]->Function () ;

    delete pC ;

    return 0 ;
}

当然,你永远不必使用像这样的原始指针。您可以使用smart pointers代替,也可以将内存包装到RAII的类中。