Udostępnij za pośrednictwem


Korzystanie z plików źródłowych MFC

Biblioteka klasy Microsoft Foundation (MFC) dostarcza pełny kod źródłowy. Pliki nagłówków (.h) znajdują się w katalogu \atlmfc\include . Pliki implementacji (cpp) znajdują się w katalogu \atlmfc\src\mfc .

W tym artykule wyjaśniono konwencje używane przez MFC do komentowania różnych części każdej klasy, co oznaczają te komentarze i czego należy oczekiwać w każdej sekcji. Kreatory programu Visual Studio używają podobnych konwencji dla klas tworzonych dla Ciebie i prawdopodobnie znajdziesz te konwencje przydatne dla własnego kodu.

Być może znasz publicsłowa kluczowe , protectedi private C++. W plikach nagłówków MFC znajdziesz każdą klasę z kilkoma z nich. Na przykład publiczne zmienne składowe i funkcje mogą znajdować się w więcej niż jednym public słowie kluczowym. Jest to spowodowane tym, że MFC oddziela zmienne składowe i funkcje na podstawie ich użycia, a nie według typu dozwolonego dostępu. MFC używa private oszczędnie. Nawet elementy uważane za szczegóły implementacji są często protected, a wiele razy to public. Chociaż nie zaleca się dostępu do szczegółów implementacji, MFC pozostawia ci decyzję.

W plikach źródłowych MFC i plikach nagłówkowych tworzonych przez Kreatora aplikacji MFC znajdziesz komentarze podobne do tych w deklaracjach klas (zwykle w tej kolejności):

// Constructors

// Attributes

// Operations

// Overridables

// Implementation

Przykład komentarzy

Poniższa częściowa lista klas CStdioFile używa większości standardowych komentarzy używanych przez MFC w klasach do dzielenia składowych klas według sposobów ich użycia:

/*============================================================================*/
// STDIO file implementation

class CStdioFile : public CFile
{
    DECLARE_DYNAMIC(CStdioFile)

public:
// Constructors
    CStdioFile();

    // . . .

// Attributes
    FILE* m_pStream;    // stdio FILE
                        // m_hFile from base class is _fileno(m_pStream)

// Operations
    // reading and writing strings
    virtual void WriteString(LPCTSTR lpsz);
    virtual LPTSTR ReadString(_Out_writes_z_(nMax) LPTSTR lpsz, _In_ UINT nMax);
    virtual BOOL ReadString(CString& rString);

// Implementation
public:
    virtual ~CStdioFile();
#ifdef _DEBUG
    void Dump(CDumpContext& dc) const;
#endif
    virtual ULONGLONG GetPosition() const;
    virtual ULONGLONG GetLength() const;
    virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);

    // . . .

protected:
    void CommonBaseInit(FILE* pOpenStream, CAtlTransactionManager* pTM);
    void CommonInit(LPCTSTR lpszFileName, UINT nOpenFlags, CAtlTransactionManager* pTM);
};

Te komentarze konsekwentnie oznaczają sekcje deklaracji klasy, które zawierają podobne rodzaje składowych klasy. Należy pamiętać, że są to konwencje MFC, a nie ustawione reguły.

Komentarz konstruktorów

Sekcja // Constructors deklaracji klasy MFC deklaruje konstruktory (w sensie języka C++) i wszystkie funkcje inicjowania wymagane do rzeczywistego używania obiektu. Na przykład znajduje się w sekcji konstruktorów, CWnd::Create ponieważ przed użyciem CWnd obiektu musi być "w pełni skonstruowany", najpierw wywołując konstruktor języka C++, a następnie wywołując Create funkcję. Zazwyczaj te elementy członkowskie są publiczne.

Na przykład klasa CStdioFile ma pięć konstruktorów, z których jedna jest wyświetlana na liście w obszarze Przykład komentarzy.

Komentarz atrybutów

Sekcja // Attributes deklaracji klasy MFC zawiera atrybuty publiczne (lub właściwości) obiektu. Zazwyczaj atrybuty są zmiennymi składowymi lub funkcjami Get/Set. Funkcje "Get" i "Set" mogą być wirtualne lub nie. Funkcje "Get" są często const, ponieważ w większości przypadków nie mają skutków ubocznych. Te elementy członkowskie są zwykle publiczne. Chronione i prywatne atrybuty są zwykle znajdowane w sekcji implementacji.

Na przykładowej liście z klasy CStdioFilew obszarze Przykładowe komentarze lista zawiera jedną zmienną składową, m_pStream. Klasa CDC wyświetla prawie 20 członków w tym komentarzu.

Uwaga

Duże klasy, takie jak CDC i CWnd, mogą mieć tak wiele elementów członkowskich, które po prostu wymieniają wszystkie atrybuty w jednej grupie, nie dodałyby zbyt wiele do jasności. W takich przypadkach biblioteka klas używa innych komentarzy jako nagłówków, aby dalej określać składowe. Na przykład używa wartości CDC// Device-Context Functions, , // Drawing Attribute Functions// Drawing Tool Functionsi innych. Grupy reprezentujące atrybuty będą zgodne ze zwykłą składnią opisaną powyżej. Wiele klas OLE ma sekcję implementacji o nazwie // Interface Maps.

Komentarz operacji

Sekcja // Operations deklaracji klasy MFC zawiera funkcje składowe, które można wywołać na obiekcie w celu wykonania czynności lub wykonania akcji (wykonywanie operacji). Funkcje te są zwykle nieconst - ponieważ zwykle mają skutki uboczne. Mogą być wirtualne lub niewirtualne w zależności od potrzeb klasy. Zazwyczaj te elementy członkowskie są publiczne.

W przykładowej liście z klasy CStdioFile, w przykładzie komentarzy lista zawiera trzy funkcje składowe w tym komentarzu: WriteString i dwa przeciążenia ReadString.

Podobnie jak w przypadku atrybutów, operacje można dalej podzielić.

Komentarz do zastępowania

Sekcja // Overridables deklaracji klasy MFC zawiera funkcje wirtualne, które można zastąpić w klasie pochodnej, gdy trzeba zmodyfikować zachowanie klasy bazowej. Zazwyczaj nazywa się je od "Włączone", chociaż nie jest to ściśle konieczne. Funkcje są tutaj zaprojektowane tak, aby zostały zastąpione i często implementują lub udostępniają pewnego rodzaju "wywołanie zwrotne" lub "hak". Zazwyczaj te elementy członkowskie są chronione.

W samej usłudze MFC czyste funkcje wirtualne są zawsze umieszczane w tej sekcji. Czysta funkcja wirtualna w języku C++ przyjmuje postać:

virtual void OnDraw( ) = 0;

Na przykładowej liście z klasy CStdioFile, w przykładzie komentarzy lista nie zawiera sekcji przesłonięć. Klasa CDocument, z drugiej strony zawiera listę około 10 zastępowalnych funkcji składowych.

W niektórych klasach może również zostać wyświetlony komentarz // Advanced Overridables. Te funkcje to te, które tylko zaawansowani programiści powinni próbować zastąpić. Prawdopodobnie nigdy nie trzeba ich zastąpić.

Uwaga

Konwencje opisane w tym artykule również działają dobrze, ogólnie, dla metod i właściwości automatyzacji (dawniej znanej jako automatyzacja OLE). Metody automatyzacji są podobne do operacji MFC. Właściwości automatyzacji są podobne do atrybutów MFC. Zdarzenia automatyzacji (obsługiwane dla kontrolek ActiveX, wcześniej znane jako kontrolki OLE) są podobne do funkcji składowych, które można zastąpić MFC.

Komentarz implementacji

Sekcja // Implementation jest najważniejszą częścią każdej deklaracji klasy MFC.

Ta sekcja zawiera wszystkie szczegóły implementacji. W tej sekcji mogą pojawić się zarówno zmienne składowe, jak i funkcje składowe. Wszystko poniżej tego wiersza może ulec zmianie w przyszłej wersji MFC. Jeśli nie możesz tego uniknąć, nie należy polegać na szczegółach poniżej // Implementation wiersza. Ponadto członkowie zadeklarowani poniżej wiersza implementacji są nieudokumentowani, chociaż niektóre implementacje zostały omówione w uwagach technicznych. Przesłonięcia funkcji wirtualnych w klasie bazowej znajdują się w tej sekcji, niezależnie od tego, w której sekcji zdefiniowano funkcję klasy bazowej. Gdy funkcja zastępuje implementację klasy bazowej, jest traktowana jako szczegóły implementacji. Zazwyczaj te elementy członkowskie są chronione, ale nie zawsze.

Na liście w CStdioFile obszarze Przykład komentarzy członkowie zadeklarowani poniżej // Implementation komentarza mogą być deklarowani jako public, protectedlub private. Należy używać tych członków z ostrożnością, ponieważ mogą one ulec zmianie w przyszłości. Deklarowanie grupy elementów członkowskich, które public mogą być niezbędne do poprawnej implementacji biblioteki klas. Nie oznacza to jednak, że można bezpiecznie używać tak zadeklarowanych członków.

Uwaga

Komentarze pozostałych typów można znaleźć powyżej lub poniżej komentarza // Implementation . W obu przypadkach opisują rodzaje zadeklarowanych poniżej elementów członkowskich. Jeśli wystąpią one poniżej komentarza // Implementation , należy założyć, że członkowie mogą ulec zmianie w przyszłych wersjach MFC.

Zobacz też

Tematy ogólne dotyczące MFC