Каков наилучший способ вернуть указатель на векторные данные?const или не const? - PullRequest
1 голос
/ 10 августа 2011
#include <vector>

using std::vector;

class A
{

public:
    A()
    {
        buf.push_back(65);
        buf.push_back(66);
        buf.push_back(67);
    }

    ~A(){}

    const char *  getA() const
    {
        // why never run here?
        return &buf[0];
    }

    const char * getA()
    {
        return &buf[0];
    }

    char *  getB() const
    {
        // why compile error?
        return &buf[0];
    }

    char * getB()
    {
        return &buf[0];
    }

private:
    vector<char> buf;
};

int main()
{
    A a;
    const char * pc = a.getA();
    const char * const cp = a.getA();
    char * p = a.getB();
}

два вопроса:

1> Почему возникает ошибка компиляции?

2> Почему

const char * getA () const

никогда не будет вызван? (На мой взгляд, этот должен быть вызван во-первых, потому что я не буду менять объект)

Я отлажен в вектор реализации класса и обнаружил, что

оператор ссылки [] (size_type _Pos) const {...}

был вызван, а не

оператор const_reference [] (size_type _Pos) const {...}

one.

PS: я использую VS2010.

Ответы [ 4 ]

5 голосов
/ 10 августа 2011

Вопрос 1

Произошла ошибка компилятора, поскольку вы объявили getB() как const. Таким образом, buf фактически является const, поэтому operator[] вернет ссылку const на элемент member.

Вопрос 2

Эта перегрузка getA() никогда не вызывается, потому что a не const, поэтому перегрузка не const имеет приоритет. Если вы делаете:

const A *p = &a;
p->getA();

тогда будет вызвана перегрузка const.

1 голос
/ 10 августа 2011

Ваш второй вопрос: причина «A a» не была постоянной, const версия никогда не будет вызвана!

0 голосов
/ 10 августа 2011

Я отвечу на ваш второй вопрос.Прочитайте это const правильность .Он говорит, что если вы хотите, чтобы ваша const-перегрузка вызывалась, ваш объект тоже должен быть const.

0 голосов
/ 10 августа 2011

В функции-члене const каждый член класса равен const.Тем не менее, вы не можете вернуть неконстантный указатель из константного вектора, поэтому ошибка в этом коде:

char* getB() const
{
    // why compile error?
    return &buf[0];
}

Поскольку внутри функции, buf становится const vector<char>, и, следовательно, &bug[0] становитсяcont char*.Поэтому вам нужно сделать тип возвращаемого значения const char*, чтобы исправить ошибку компиляции.

...