[英]C++ noob question: pointers and overloaded []
我盯着这个已经有一段时间了,并没有走太远。 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':无法访问在'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];
}
但是在这里我得到一个错误
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
对象数组的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.