Что делают эти фрагменты кода C ++? - PullRequest
2 голосов
/ 30 августа 2009
#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
#endif

Зачем определять эти теги?

CSortHeaderCtrl::CSortHeaderCtrl()
    : m_iSortColumn( -1 )
    , m_bSortAscending( TRUE )
{
}

Для чего используются две функции после двоеточия?

BEGIN_MESSAGE_MAP(CSortHeaderCtrl, CHeaderCtrl)
    //{{AFX_MSG_MAP(CSortHeaderCtrl)
        // NOTE - the ClassWizard will add and remove mapping macros here.
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

Есть ли в C # похожие вещи?

Для чего это используется?

virtual ~CSortHeaderCtrl();

Зачем устанавливать функцию деструктора как виртуальную?

void CSortHeaderCtrl::Serialize( CArchive& ar )

Когда будет вызываться эта функция?

Это расширение от родителя?

Кстати, когда вы хотите расширить класс MFC, какой документ вы будете читать?

Поскольку мы не знаем, какую функцию он имеет, какую функцию мы можем переопределить?

Ниже приведен заголовочный файл:

/* File: SortHeaderCtrl.h 

   Purpose:  Provides the header control, with drawing of
             the arrows, for the list control.
*/

#ifndef SORTHEADERCTRL_H
#define SORTHEADERCTRL_H

#if _MSC_VER > 1000
    #pragma once
#endif // _MSC_VER > 1000

class CSortHeaderCtrl : public
CHeaderCtrl { // Construction public:
    CSortHeaderCtrl();

    // Attributes public:

    // Operations public:

    // Overrides     // ClassWizard generated
    virtual function overrides
        //{{AFX_VIRTUAL(CSortHeaderCtrl)
        public:     virtual void Serialize(CArchive& ar);
        //}}AFX_VIRTUAL

    // Implementation public:     virtual
    ~CSortHeaderCtrl();

    void SetSortArrow( 
        const int iColumn,
        const BOOL bAscending );

        // Generated message map functions
    protected:     
        void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct );

        int m_iSortColumn;     
        BOOL m_bSortAscending;

        //{{AFX_MSG(CSortHeaderCtrl)         //
        NOTE - the ClassWizard will add and
        remove member functions here.
        //}}AFX_MSG

    DECLARE_MESSAGE_MAP() };

//{{AFX_INSERT_LOCATION}} // Microsoft
Visual C++ will insert additional
declarations immediately before the
previous line.

#endif // SORTHEADERCTRL_H

Ответы [ 5 ]

6 голосов
/ 30 августа 2009

Вопрос 1. Вероятно, DEBUG_NEW, поэтому оператор 'new' записывает некоторую дополнительную информацию о том, где и когда был выделен блок, чтобы помочь в обнаружении утечек памяти, см. this . Массив статических символов THIS_FILE [] simple содержит текущее имя файла, вероятно, используемый отладкой 'new'

Вопрос 2. Это список инициализации C ++.

Вопрос 3: Деструктор объявлен виртуальным, потому что существуют другие виртуальные члены, и это производный класс. Оператор 'delete' должен знать правильный размер удаляемого объекта, а также фактический вызывающий дескриптор, см. this

3 голосов
/ 30 августа 2009

Что касается вопроса 2: это не функции. Они инициализатор списки для членов CSortHeaderCtrl. Вы можете думать об этом как эквивалентно:

m_iSortColumn = -1;
m_bSortAscending = TRUE;

Я подчеркиваю «думать об этом», потому что для членов , которые classes , будет вызван только конструктор копирования (вместо Скопируйте конструктор и затем оператор присваивания).

Обратите внимание, что со списком инициализаторов порядок инициализации определяется не порядком написания, а порядком наследования классов и по порядку объявления члена переменные.

2 голосов
/ 30 августа 2009

Зачем определять эти теги?

См. Ответ Джкопены.

Для чего используются две функции после двоеточия?

См. Ответ Петра.

Есть ли в C # похожие вещи? Для чего это используется?

В C # это может быть реализовано как словарь делегатов.

Она называется «картой сообщений» (вероятно, описанной в одном из подразделов Обработка и отображение справочных сообщений библиотеки MFC ).

Его содержимое обычно создается / редактируется с помощью IDE "Class Wizard" (не редактируется вручную с помощью редактора кода / текста).

Зачем устанавливать функцию деструктора как виртуальную?

В C ++, если класс может быть разделен на подклассы, его деструктор почти всегда должен быть виртуальным (потому что в противном случае, если он не виртуальный, и вы вызываете его, удаляя указатель на суперкласс, деструктор подкласса не будет вызван) .

Когда будет вызываться эта функция?

Это, вероятно, описано здесь: Сериализация ссылок на библиотеки MFC в MFC .

это расширение от родителя?

В соответствии с той ссылкой, которую я только что дал выше, это класс-предок CObject: «MFC предоставляет встроенную поддержку сериализации в классе CObject. Таким образом, все классы, производные от CObject, могут использовать преимущества протокола сериализации CObject».

Кстати, когда вы хотите расширить класс MFC, какой документ вы будете читать?

Справочная документация МФЦ.

Поскольку мы не знаем, какую функцию он имеет, какую функцию мы можем переопределить ...

Обычно вы можете переопределить все, что виртуально, а не приватно. Я думаю, что вы также можете / вместо этого использовать Class Wizard, встроенный в IDE.

CSortHeaderCtrl, очевидно, является сторонним классом, но не классом Microsoft. Возможно, его авторы / поставщики написали какую-то документацию для него, если вы собираетесь его использовать.

2 голосов
/ 30 августа 2009

Прежде всего, CSortHeaderCtrl имеет виртуальный деструктор, потому что в C ++ целесообразно делать деструкторы виртуальными.

Деструкторы делаются виртуальными в базовых классах, поскольку это означает, что будут вызываться деструкторы в классах, производных от базовых классов.

Если деструкторы в производных классах не вызываются (т. Е. Деструктор базового класса не виртуален), то они, скорее всего, будут пропускать память и оставлять ресурсы (потоки, дескрипторы и т. Д.) Открытыми.

Оставшаяся часть кода, который вы разместили, генерируется Visual Studio для обработки общих или избыточных задач MFC, например, сопоставления сообщений Win32 с функциями-членами вашего класса или окна. Вы не должны трогать этот код, так как он может быть переопределен, иначе вы сломаете его и у вас возникнет головная боль, связанная с отладкой.

1 голос
/ 30 августа 2009

Когда мой деструктор должен быть виртуальным?

http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...