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 public
słowa kluczowe , protected
i 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 CStdioFile
w 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 Functions
i 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
, protected
lub 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.