C++ C++;noob问题:指针和重载[]
我已经盯着这个看了一段时间,没走多远。水果篮工厂、水果篮和水果是我使用的API中的三个类。我的目标是做一个果篮,然后取回水果。根据FruitBasketFactory.hpp: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
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[]
的对象的指针。好建议!我不明白复制构造函数被阻止了。