1

私はしばらくこれを見つめていましたが、それほど遠くはありません。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];
}
4

1 に答える 1

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ます。

于 2010-07-19T00:14:48.327 に答える