详解C++编程中的嵌套类的声明与其中的函数使用
可以在一个类的范围内声明另一个类。这样的类称为“嵌套类”。 嵌套类被视为在封闭类的范围内且可在该范围内使用。若要从嵌套类的即时封闭范围之外的某个范围引用该类,则必须使用完全限定名。 // nested_class_declarations.cpp class BufferedIO { public: enum IOError { None,Access,General }; // Declare nested class BufferedInput. class BufferedInput { public: int read(); int good() { return _inputerror == None; } private: IOError _inputerror; }; // Declare nested class BufferedOutput. class BufferedOutput { // Member list }; }; int main() { } 在 BufferedIO::BufferedInput 中声明 BufferedIO::BufferedOutput 和 BufferedIO。这些类名称在类 BufferedIO 的范围外不可见。但是,BufferedIO 类型的对象不包含 BufferedInput 或 BufferedOutput 类型的任何对象。 // nested_class_declarations_2.cpp class C { public: typedef class U u_t; // class U visible outside class C scope typedef class V {} v_t; // class V not visible outside class C }; int main() { // okay,forward declaration used above so file scope is used U* pu; // error,type name only exists in class C scope u_t* pu2; // C2065 // error,class defined above so class C scope V* pv; // C2065 // okay,fully qualified name C::V* pv2; } 嵌套类中的访问权限 // member_functions_in_nested_classes.cpp class BufferedIO { public: enum IOError { None,General }; class BufferedInput { public: int read(); // Declare but do not define member int good(); // functions read and good. private: IOError _inputerror; }; class BufferedOutput { // Member list. }; }; // Define member functions read and good in // file scope. int BufferedIO::BufferedInput::read() { return(1); } int BufferedIO::BufferedInput::good() { return _inputerror == None; } int main() { } 在前面的示例中,qualified-type-name 语法用于声明函数名称。声明: BufferedIO::BufferedInput::read() 表示“作为 read 类(位于 BufferedInput 类的范围中)的成员的 BufferedIO 函数。” 由于此声明使用 qualified-type-name 语法,因此以下形式的构造是可能的: typedef BufferedIO::BufferedInput BIO_INPUT; int BIO_INPUT::read() 上述声明与前一个声明等效,但它使用了 typedef 名称来代替类名称。 // friend_functions_and_nested_classes.cpp #include <string.h> enum { sizeOfMessage = 255 }; char *rgszMessage[sizeOfMessage]; class BufferedIO { public: class BufferedInput { public: friend int GetExtendedErrorStatus(); static char *message; static int messageSize; int iMsgNo; }; }; char *BufferedIO::BufferedInput::message; int BufferedIO::BufferedInput::messageSize; int GetExtendedErrorStatus() { int iMsgNo = 1; // assign arbitrary value as message number strcpy_s( BufferedIO::BufferedInput::message,BufferedIO::BufferedInput::messageSize,rgszMessage[iMsgNo] ); return iMsgNo; } int main() { } 以下代码演示声明为友元函数的函数 GetExtendedErrorStatus。在文件范围内定义的函数中,将消息从静态数组复制到类成员中。请注意,GetExtendedErrorStatus 的更佳实现是将其声明为: int GetExtendedErrorStatus( char *message ) 利用前面的接口,许多类可以通过传递要复制错误消息的内存位置来使用此函数的服务。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |