繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM