【发布时间】:2010-07-19 00:10:02
【问题描述】:
我已经盯着这个看了一段时间,并没有走得太远。 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());
但在这里我得到一个错误“error C2248: 'FruitBasket::FruitBasket' : cannot access private member declaration in class '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];
}
【问题讨论】:
标签: c++ pointers operator-overloading dereference