Вопрос C ++ noob: указатели и перегруженные [] - PullRequest
1 голос
/ 19 июля 2010

Я смотрел на это некоторое время и не очень далеко.FruitBasketFactory, FruitBasket и Fruit - это три класса из API, который я использую.Моя цель - сделать корзину с фруктами, а затем забрать фрукты.Согласно FruitBasketFactory.hpp:

const FruitBasket* getFruitBasket() const;

, а затем в FruitBasket.hpp

size_t getNumFruits() const;
const Fruit& operator[](size_t index) const;

Итак, вот мой начальный код:

FruitBasketFactory fruitBasketFactory;
//since I want an object rather than a pointer I attempt to dereference the pointer
const FruitBasket fruitBasket = *(fruitBasketFactory.getFruitBasket());

Но вот яполучить ошибку "ошибка C2248: 'FruitBasket :: FruitBasket': невозможно получить доступ к закрытому члену, объявленному в классе 'FruitBasket'" .Разве это не должно работать?

Итак, хорошо ... Я переделываю свой код.

FruitBasketFactory fruitBasketFactory;
const FruitBasket* fruitBasket = fruitBasketFactory.getFruitBasket();

if(fruitBasket->getNumFruits() > 0) {
    //using (*fruitBasket)[0] seems silly
    const Fruit fruit = (*fruitBasket)[0];
}

И ошибка : "Ошибка C2248: 'Fruit:: Fruit ': не может получить доступ к закрытому члену, объявленному в классе' Fruit '"

Итак, еще одна доработка

FruitBasketFactory fruitBasketFactory;
const FruitBasket* fruitBasket = fruitBasketFactory.getFruitBasket();

if(fruitBasket->getNumFruits() > 0) {
    //this is just ludicrous ... I'm doing something wrong
    const Fruit* fruit = &(fruitBasket->operator[](0));
}

Как бы глупо ни выглядел этот код, он действительно работает,Но почему я могу просто сделать то, что я считаю наиболее очевидным?

FruitBasketFactory fruitBasketFactory;
const FruitBasket fruitBasket = *(fruitBasketFactory.getFruitBasket());

if(fruitBasket.getNumFruits() > 0) {
    const Fruit fruit = fruitBasket[0];
}

Разрешение:

Конструкторы копирования действительно были заблокированы как для FruitBasket, так и для Fruit.Мне удалось обойти их, создавая ссылки следующим образом:

FruitBasketFactory fruitBasketFactory;
const FruitBasket& fruitBasket = *(fruitBasketFactory.getFruitBasket());

if(fruitBasket.getNumFruits() > 0) {
    const Fruit& fruit = fruitBasket[0];
}

1 Ответ

1 голос
/ 19 июля 2010

Но тут я получаю ошибку error C2248: 'FruitBasket::FruitBasket' : cannot access private member declared in class 'FruitBasket'.

Конструктор копирования для FruitBasket недоступен. Вы объявили конструктор копирования для этого класса как закрытый или защищенный? Есть ли в этом классе какие-либо базы или члены, которые нельзя скопировать (т. Е. Которые не имеют общедоступных конструкторов копирования)?

Чтобы ответить на ваш последний вопрос, это:

const Fruit* fruit = &(fruitBasket->operator[](0));

можно написать гораздо более разумно, как это:

const Fruit* fruit = &(*fruitBasket)[0];

Указатель должен быть разыменован, чтобы оператор индекса был применен к объекту FruitBasket типа класса, а не к указателю на FruitBasket.

Если вы применяете нижний индекс указателя, используется встроенный оператор нижнего индекса, и указатель обрабатывается как указатель на массив FruitBasket объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...