私はしばらくこれを見つめていましたが、それほど遠くはありません。FruitBasketFactory、FruitBasket、Fruitは、私が使用しているAPIの3つのクラスです。私の目標は、フルーツバスケットを作り、それから果物を回収することです。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];
}