разница переменной в размещении частного ключевого слова в классе MFC - PullRequest
2 голосов
/ 14 июля 2009

Используя следующий фрагмент кода в качестве иллюстрации к моему вопросу:

// #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

    ...
}

Когда я помещаю ключевое слово «private» в определение MyClass как таковое, переменная-член privateContent не кажется закрытой, когда я пытаюсь получить к нему доступ в методе класса MusicPlayer. Однако, если я помещу ключевое слово "private" после строки DECLARE_DYNCREATE (MyClass), поведение переменной-члена privateContent вернется к ожидаемому. Кто-нибудь знает, почему это так? Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 14 июля 2009

Если вы посмотрите на определение 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:, после чего оставшаяся часть определения класса станет общедоступной.

Поэтому, когда вы говорите «1012» после DECLARE_DYNCREATE, вы меняете его с общего на частное.

Обычное использование этого макроса будет выглядеть так:

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

        ...

public:
        bool publicContent;

        ...
};

Класс неявно будет закрытым в начале, поэтому эффект тот же.

Кроме того, большинство программистов на C ++ согласятся с тем, что вам следует начать пытаться привыкнуть размещать свои личные переменные внизу.

Оправдание состоит в том, что когда люди, включая вас, читают класс, они захотят увидеть, что вы можете сделать с классом, который находится в общедоступном интерфейсе, а не как класс будет работать, что частный.

Ставя публичный интерфейс на первое место, вам не придется беспокоиться обо всех личных вещах.

Раньше я тоже ставил свои личные вещи наверх (потому что я пришел из Visual Basic 6, до C ++), и ненавидел, когда мне говорили, что мои рядовые люди должны быть внизу, но как только вы привыкнете, вы захотите ты изменился раньше.

0 голосов
/ 14 июля 2009

Я думаю, что макрос DECLARE_DYNCREATE должен использовать public: идентификатор внутри. Зачем? Если вы измените вышеуказанный код так, чтобы privateContent был объявлен над макросом DECLARE_DYNCREATE, он будет иметь ожидаемое поведение. Таким образом, я делаю вывод, что макрос делает public: Поэтому вам снова нужно объявить соответствующий идентификатор после макроса.

0 голосов
/ 14 июля 2009

DECLARE_DYNCREATE - макрос, содержащий ключевое слово public. На самом деле он содержит макрос DECLARE_DYNAMIC и ключевое слово public.

...