我已经盯着这个看了一段时间,并没有走得太远。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': cannot access private member declared 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];
}