Как реализовать operator [] для класса, который содержит std :: vector - PullRequest
2 голосов
/ 24 февраля 2020

Я бы хотел переопределить оператор [] для объекта, который содержит объект std::vector (то есть иметь действие подписки, как если бы оно было непосредственно применено к вектору-члену). Это то, что у меня пока есть

using namespace std;
#include <string>
#include <iostream>
#include <vector>

class VectorWrapper
{
public:
    VectorWrapper(int N): _N(N), _vec(N) {}

    ~VectorWrapper() {delete &_vec;}

    string operator[](int index) const
    {
        return _vec[index];
    }

    string& operator[](int index)
    {
        return _vec[index];
    }


private:
    int _N;
    vector<string> _vec;
};

int main()
{
    VectorWrapper vo(5);
    vo[0] = "str0";
    std::cout << vo[0];
}

Что при запуске выдает следующую ошибку

Process finished with exit code 11

Что я делаю не так?

1 Ответ

9 голосов
/ 24 февраля 2020

Вы пытаетесь удалить своего участника в деструкторе. Используйте delete только для объектов, которые вы создали с помощью new. Удалите этот деструктор полностью, язык будет обрабатывать уничтожение для вас.

Кроме того, ваш первый оператор индекса должен возвращать константную ссылку

string const& operator[](int index) const

вместо значения.

Кроме того, _N является незаконным именем. Вы не можете называть вещи, начинающиеся с символа подчеркивания, за которым следует заглавная буква.

...