0

私は次のものを持っています

    struct dweDMPair {
        const dweller   *occu;
        const double    sqDM;
        float   prob;
        dweDMPair(dweller *inOccu, double sqdm) : occu(inOccu), sqDM(sqdm) {}       };

これらのオブジェクトへのポインターの配列を返したいのですが、クライアントによって誤って削除されないようにしたいと考えています。または、そうではないかもしれませんが、この設計の反復を試してみてください。

私の質問は、メンバーがコンストラクターでのみ割り当てられることを (const プレフィックスで示したように) 指定する (非常に簡潔できちんとした) 方法はありますか?

private/public および interface/methods でこれをソートできることは知っていますが、ユーモアを交えながら、このconstキーワードはどこまで悪用できるのでしょうか?

_編集_

私の目標は、コンストラクターで 3 つのデータ メンバーのうち 2 つを 1 回だけ初期化することです。次に、このインスタンスを const dweDMPair *ptrToVal としてエクスポートして、クライアントが delete を呼び出せないようにすることができます。その後、クライアントは 3 番目のメンバーに独自の値を指定しますprob。ええ、関数が保護を強制することは知っていますが、より速くしたいです。

メンバーは静的ではなく、インスタンス メンバーにすることができます。迷っていたら..

4

2 に答える 2

2

はい、 const はあなたが望むことをします。コンストラクタ初期化子リストで行うことは代入ではなく、初期化であることに注意してください。const オブジェクトに代入することはできませんが、値で初期化できます。また、const にするかどうかに関係なく、これらのメンバーをプライベート メンバーとしてクラスにカプセル化することを検討することもできます。タイピングはそれほど多くありませんが、保守性が向上します。

編集:

const ポインターを定義するには、次のようにします。

Type * const member;

いいえ

const Type* member;

2 番目の構文は、const ポインターではなく、const 型へのポインターです。

于 2011-08-28T19:52:34.507 に答える
1

あなたが本当に欲しいものは次のとおりであることを明確にします。

次に、このインスタンスを const dweDMPair *ptrToVal としてエクスポートして、クライアントが delete を呼び出せないようにすることができます。

Delete は、インスタンスへのポインターで呼び出すことができ、メンバーconstを含むオブジェクトで呼び出すことができます。constをこのように使用しconstても、目標を達成するのに役立ちません。

問題なくコンパイルされるコードの例:

struct dweller {
};

 struct dweDMPair {
        const dweller   *occu;
        const double    sqDM;
        float   prob;
        dweDMPair(dweller *inOccu, double sqdm) : occu(inOccu), sqDM(sqdm) {}       
 };

int main() {

    dweDMPair const* p = new dweDMPair(NULL, 3.14);

    delete p;
}

最終目標をさらに明確にしたい場合があります(これがあまりにも大きく変わる場合は、おそらく別の質問で)。

于 2011-08-28T20:03:30.073 に答える