1

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

1 回答 1

1

但在这里我得到一个错误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对象数组的指针。

于 2010-07-19T00:14:48.327 回答