【问题标题】:C++ noob question: pointers and overloaded []C++菜鸟问题:指针和重载[]
【发布时间】:2010-07-19 00:10:02
【问题描述】:

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

但在这里我得到一个错误“error C2248: 'FruitBasket::FruitBasket' : cannot access private member declaration 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];
}

【问题讨论】:

    标签: c++ pointers operator-overloading dereference


    【解决方案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 对象数组的指针。

    【讨论】:

    • OP 的“初始代码”似乎表明您对他最后一个问题的回答无效。
    • @Forrest:我给出的替代方案是等价的; p->operator[](0)(*p)[0] 相同,其中p 是指向重载operator[] 的对象的指针。
    • 好建议!我不明白复制构造函数被阻止了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多