2

次のコードスニペットを私の質問の例として使用します。

// #includes and other macros

class MyClass : public CFormView
{
private:
        DECLARE_DYNCREATE(MyClass)

        bool privateContent;

        ...

public:
        bool publicContent;

        ...
};

class MusicPlayer
{
public:
    AppClass *theApp;                   // which has a pointer accessing the MyClass object instantiated in the program

    ...
}

MyClass定義にキーワード「private」をそのまま配置すると、MusicPlayerクラスのメソッドでアクセスしようとすると、privateContentメンバー変数がプライベートに表示されません。ただし、DECLARE_DYNCREATE(MyClass)行の後に「private」キーワードを配置すると、privateContentメンバー変数の動作は期待どおりに戻ります。なぜこれが当てはまるのか誰かが知っていますか?前もって感謝します。

4

3 に答える 3

9

の定義をDECLARE_DYNCREATE見ると、別のマクロを使用していることがわかります。

// not serializable, but dynamically constructable
#define DECLARE_DYNCREATE(class_name) \
    DECLARE_DYNAMIC(class_name) \
    static CObject* PASCAL CreateObject();

そのマクロをDECLARE_DYNAMIC見ると、クラスがパブリックになる理由がわかります。

#define DECLARE_DYNAMIC(class_name) \
protected: \
    static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
    static const CRuntimeClass class##class_name; \
    static CRuntimeClass* PASCAL GetThisClass(); \
    virtual CRuntimeClass* GetRuntimeClass() const; \

展開すると、そのキーワードが追加されpublic:、その後、残りのクラス定義は公開されます。

したがって、 say private:afterと言うとDECLARE_DYNCREATE、パブリックからプライベートに変更されます。

このマクロの通常の使用法は次のようになります。

class MyClass : public CFormView
{
        DECLARE_DYNCREATE(MyClass)
private:
        bool privateContent;

        ...

public:
        bool publicContent;

        ...
};

クラスは最初は暗黙的にプライベートになるため、効果は同じです。

また、ほとんどの C++ プログラマーは、プライベート変数を一番下に配置する習慣を身につけようとすることに同意するでしょう。

その正当な理由は、あなた自身を含む人々がクラスを読んでいるとき、クラスがどのように機能するか (非公開) ではなく、公開インターフェイスにあるクラスで何ができるかを見たいと思うからです。

パブリック インターフェイスを最初に置くことで、すべてのプライベートな要素に煩わされる必要がなくなります。

私もプライベートなものを一番上に置いていました (C++ より前の Visual Basic 6 から来たため)、プライベートを一番下に置くべきだと言われるのが嫌いでしたが、習慣に慣れると、もっと早く変えたいと思うでしょう。 .

于 2009-07-14T19:11:18.383 に答える
0

DECLARE_DYNCREATEpublicキーワードを含むマクロです。実際にはマクロが含まれておりDECLARE_DYNAMICpublicキーワードがあります。

于 2009-07-14T19:10:21.943 に答える
0

DECLARE_DYNCREATE マクロは public: 識別子を内部的に使用する必要があると思います。なんで?privateContent が DECLARE_DYNCREATE マクロの上で宣言されるように上記のコードを変更すると、期待どおりの動作が得られます。したがって、このマクロは「public:」を実行すると推測します。したがって、マクロの後に適切な識別子を再度宣言する必要があります。

于 2009-07-14T19:16:21.650 に答える