중첩 클래스 선언
클래스는 다른 클래스의 범위 내에서 선언될 수 있습니다. 이러한 클래스를 "중첩 클래스"라고 합니다. 중첩 클래스는 바깥쪽 클래스의 범위 내에 있는 것으로 간주되고 해당 범위 내에서 사용할 수 있습니다. 바로 바깥쪽 범위 이외의 범위에서 중첩 클래스를 참조하려면 정규화된 이름을 사용해야 합니다.
다음 예제에서는 중첩 클래스를 선언하는 방법을 보여 줍니다.
// 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 형식의 개체가 포함되지 않습니다.
중첩 클래스는 바깥쪽 클래스에서만 제공된 이름, 형식 이름, 정적 멤버의 이름 및 열거자를 직접 사용할 수 있습니다. 다른 클래스 멤버의 이름을 사용하려면 포인터, 참조 또는 개체 이름을 사용해야 합니다.
위의 BufferedIO 예제에서 good 함수에 표시된 것과 같이 중첩 클래스 BufferedIO::BufferedInput 또는 BufferedIO::BufferedOutput의 멤버 함수에서 IOError 열거형에 직접 액세스할 수 있습니다.
참고
중첩 클래스는 클래스 범위 내에서 형식만 선언하며,중첩 클래스의 포함된 개체가 만들어지지는 않습니다.위의 예제에서는 두 중첩 클래스를 선언하지만 이러한 클래스 형식의 개체는 선언하지 않습니다.
중첩 클래스 선언의 범위 표시 유형에 대한 예외는 형식 이름이 정방향 선언과 함께 선언된 경우입니다. 이 경우 정방향 선언에서 선언된 클래스 이름은 바깥쪽 클래스 외부에 표시되며 해당 범위는 가장 작은 바깥쪽 비클래스 범위로 정의됩니다. 예를 들면 다음과 같습니다.
// 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;
}