Použití zdrojových souborů MFC
Knihovna MFC (Microsoft Foundation Class) poskytuje úplný zdrojový kód. Soubory hlaviček (.h) jsou v adresáři \atlmfc\include . Implementační soubory (.cpp) jsou v adresáři \atlmfc\src\mfc .
Tento článek vysvětluje konvence, které MFC používá k zakomentování různých částí každé třídy, co tyto komentáře znamenají a co byste měli očekávat, že najdete v každé části. Průvodci sadou Visual Studio používají podobné konvence pro třídy, které pro vás vytvářejí, a pravděpodobně tyto konvence budou užitečné pro váš vlastní kód.
Možná znáte public
klíčová slova , protected
a private
C++. V souborech hlaviček MFC najdete, že každá třída může mít několik z nich. Například veřejné členské proměnné a funkce můžou být pod více než jedním public
klíčovým slovem. Je to proto, že MFC odděluje členské proměnné a funkce na základě jejich použití, nikoli podle typu povoleného přístupu. MFC používá private
střídmě. Dokonce i položky považované za podrobnosti implementace jsou často protected
a často jsou public
. I když se nedoporučuje přístup k podrobnostem implementace, MFC vás rozhodne.
Ve zdrojových souborech MFC i v hlavičkových souborech, které průvodce aplikací MFC vytvoří, najdete komentáře podobné těm v deklarací třídách (obvykle v tomto pořadí):
// Constructors
// Attributes
// Operations
// Overridables
// Implementation
Příklad komentářů
Následující částečný výpis třídy CStdioFile
používá většinu standardních komentářů, které MFC používá ve svých třídách k rozdělení členů třídy způsoby, kterými se používají:
/*============================================================================*/
// 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);
};
Tyto komentáře konzistentně označují oddíly deklarace třídy, které obsahují podobné druhy členů třídy. Mějte na paměti, že se jedná o konvence MFC, ne o nastavení pravidel.
Komentář konstruktorů
Oddíl // Constructors
deklarace třídy MFC deklaruje konstruktory (ve smyslu C++) a všechny inicializační funkce potřebné k použití objektu. Je například v oddílu konstruktorů, CWnd::Create
protože před použitím objektu CWnd
musí být "plně sestaven" zavoláním konstruktoru jazyka C++ a následným voláním Create
funkce. Obvykle jsou tito členové veřejné.
Například třída CStdioFile
má pět konstruktorů, z nichž jedna je zobrazena v seznamu pod příkladem komentářů.
Komentář k atributům
Oddíl // Attributes
deklarace třídy MFC obsahuje veřejné atributy (nebo vlastnosti) objektu. Atributy jsou obvykle členské proměnné nebo funkce Get/Set. Funkce Get a Set můžou nebo nemusí být virtuální. Funkce Get jsou často const
, protože ve většině případů nemají vedlejší účinky. Tito členové jsou obvykle veřejné. Chráněné a privátní atributy se obvykle nacházejí v části implementace.
V ukázkovém výpisu z třídy v části Příklad komentářů obsahuje seznam jednu členovou proměnnou m_pStream.CStdioFile
Předmět CDC
uvádí v tomto komentáři téměř 20 členů.
Poznámka
Velké třídy, například CDC
a CWnd
, mohou mít tolik členů, že jednoduše výpis všech atributů v jedné skupině by nepřidá mnohem srozumitelnost. V takových případech knihovna tříd používá další komentáře jako nadpisy k dalšímu vymezení členů. Například CDC
používá // Device-Context Functions
, // Drawing Tool Functions
, // Drawing Attribute Functions
a další. Skupiny představující atributy se budou řídit obvyklou syntaxí popsanou výše. Mnoho tříd OLE má oddíl implementace s názvem // Interface Maps
.
Komentář k operacím
Oddíl // Operations
deklarace třídy MFC obsahuje členské funkce, které můžete volat objekt, aby mohl provádět akce nebo provádět akce (provádět operace). Tyto funkce jsou obvykle ne-const
protože obvykle mají vedlejší účinky. V závislosti na potřebách třídy můžou být virtuální nebo nevirtuální. Obvykle jsou tito členové veřejné.
V ukázkovém výpisu z třídy CStdioFile
v příkladu komentářů obsahuje seznam tři členské funkce pod tímto komentářem: WriteString
a dvě přetížení ReadString
.
Stejně jako u atributů je možné operace dále rozdělit.
Komentář k přepisovatelným
Oddíl // Overridables
deklarace třídy MFC obsahuje virtuální funkce, které můžete přepsat v odvozené třídě, když potřebujete upravit chování základní třídy. Obvykle se označují jako "Zapnuto", i když to není nezbytně nutné. Tady jsou funkce navržené tak, aby se přepsaly, a často implementují nebo poskytují nějaký druh zpětného volání nebo "hook". Obvykle jsou tito členové chráněni.
V samotné knihovně MFC jsou v této části vždy umístěny čistě virtuální funkce. Čistá virtuální funkce v jazyce C++ má tvar:
virtual void OnDraw( ) = 0;
V ukázkovém výpisu ze třídy CStdioFile
v příkladu komentářů seznam neobsahuje žádné přepisovatelné oddíly. Třída CDocument
na druhé straně uvádí přibližně 10 přepisovatelných členských funkcí.
V některých třídách se může také zobrazit komentář // Advanced Overridables
. Tyto funkce jsou ty, které by se měli pokusit přepsat pouze pokročilí programátoři. Pravděpodobně je nebudete muset přepsat.
Poznámka
Konvence popsané v tomto článku také dobře fungují obecně pro automatizaci (dříve označované jako automatizace OLE) metody a vlastnosti. Metody automatizace jsou podobné operacím MFC. Vlastnosti automatizace jsou podobné atributům MFC. Události automatizace (podporované pro ovládací prvky technologie ActiveX, dříve označované jako ovládací prvky OLE), se podobají přepisovatelným členským funkcím MFC.
Komentář k implementaci
Oddíl // Implementation
je nejdůležitější součástí jakékoli deklarace třídy MFC.
Tato část obsahuje všechny podrobnosti implementace. V této části se můžou objevit jak členské proměnné, tak členské funkce. Všechno pod tímto řádkem se může v budoucí verzi MFC změnit. Pokud se tomu nemůžete vyhnout, neměli byste se spoléhat na podrobnosti pod řádkem // Implementation
. Kromě toho jsou členy deklarované pod řádkem implementace nezdokumentovány, i když některé implementace jsou popsány v technických poznámkách. Přepsání virtuálních funkcí v základní třídě se nachází v této části bez ohledu na to, ve které části je funkce základní třídy definována. Když funkce přepíše implementaci základní třídy, považuje se za podrobnosti implementace. Obvykle jsou tito členové chráněni, ale ne vždy.
CStdioFile
V seznamu pod příkladem komentářů mohou být členové deklarovaní pod // Implementation
komentářem deklarovány jako public
, protected
nebo private
. Tyto členy používejte opatrně, protože se můžou v budoucnu měnit. Deklarování skupiny členů, jak public
může být nezbytné, aby implementace knihovny tříd fungovala správně. Neznamená to ale, že můžete bezpečně používat členy tak deklarované.
Poznámka
Komentáře zbývajících typů najdete nad nebo pod komentářem // Implementation
. V obou případech popisují typy členů deklarovaných pod nimi. Pokud se objeví pod // Implementation
komentářem, měli byste předpokládat, že se členové můžou v budoucích verzích MFC změnit.