C++ C++;noob问题:指针和重载[]

C++ C++;noob问题:指针和重载[],c++,pointers,operator-overloading,dereference,C++,Pointers,Operator Overloading,Dereference,我已经盯着这个看了一段时间,没走多远。水果篮工厂、水果篮和水果是我使用的API中的三个类。我的目标是做一个果篮,然后取回水果。根据FruitBasketFactory.hpp: const FruitBasket* getFruitBasket() const; 然后在果篮里 size_t getNumFruits() const; const Fruit& operator[](size_t index) const; 这是我的初始代码: FruitBasketFactory fr

我已经盯着这个看了一段时间,没走多远。水果篮工厂、水果篮和水果是我使用的API中的三个类。我的目标是做一个果篮,然后取回水果。根据FruitBasketFactory.hpp:

const FruitBasket* getFruitBasket() const;
然后在果篮里

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”:无法访问类'FruitBasket'中声明的私有成员。这不管用吗

那么,好吧。。。我重新编写代码

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

if(fruitBasket->getNumFruits() > 0) {
    //using (*fruitBasket)[0] seems silly
    const Fruit fruit = (*fruitBasket)[0];
}
fail:“错误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];
}

决议: 果篮和水果的拷贝构造函数确实都被阻止了。我可以通过如下方式创建引用来绕过呼叫他们:

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

if(fruitBasket.getNumFruits() > 0) {
    const Fruit& fruit = fruitBasket[0];
}
但这里我得到一个错误
错误C2248:'FruitBasket::FruitBasket':无法访问类'FruitBasket'中声明的私有成员

水果篮的复制构造函数不可访问。您是否已将此类的复制构造函数声明为private或protected?此类是否有任何不可复制的基或成员(即,没有可公开访问的复制构造函数)

要回答您的最后一个问题,请执行以下操作:

const Fruit* fruit = &(fruitBasket->operator[](0));
可以更合理地这样写:

const Fruit* fruit = &(*fruitBasket)[0];
必须取消对指针的引用,以便将下标运算符应用于类类型
水果篮
对象,而不是指向
水果篮
的指针

如果应用指针的下标,则将使用内置的下标运算符,指针将被视为指向
子篮
对象数组的指针

但这里我得到一个错误
错误C2248:'FruitBasket::FruitBasket':无法访问类'FruitBasket'中声明的私有成员

水果篮的复制构造函数不可访问。您是否已将此类的复制构造函数声明为private或protected?此类是否有任何不可复制的基或成员(即,没有可公开访问的复制构造函数)

要回答您的最后一个问题,请执行以下操作:

const Fruit* fruit = &(fruitBasket->operator[](0));
可以更合理地这样写:

const Fruit* fruit = &(*fruitBasket)[0];
必须取消对指针的引用,以便将下标运算符应用于类类型
水果篮
对象,而不是指向
水果篮
的指针


如果应用指针的下标,将使用内置的下标运算符,指针将被视为指向
果篮
对象数组的指针。

OP的“初始代码”似乎表明您对他最后一个问题的答案无效。@Forrest:我给出的备选方案是等效的
p->operator[](0)
(*p)[0]
相同,其中
p
是指向重载
operator[]
的对象的指针。好建议!我不明白复制构造函数被阻止了。OP的“初始代码”似乎表明你对他最后一个问题的回答不起作用。@Forrest:我给出的替代方案是等效的
p->operator[](0)
(*p)[0]
相同,其中
p
是指向重载
operator[]
的对象的指针。好建议!我不明白复制构造函数被阻止了。