// nestedclass.h
#ifndef NECLASS_H_INCLUDED
#define NECLASS_H_INCLUDED

class A
{
public:
	A();
	~A();

	void operate();

private:
	class B;        // ÉùÃ÷¿ÉÒÔдÀà»òÕߺ¯ÊýÀïÃæ
	B* m_b;
};


#endif // NECLASS_H_INCLUDED


// nestedclass.cpp

#include "nestedclass.h"
#include <iostream>
using namespace std;

class A::B
{
public:
	B(){}
	~B(){}

	void operate() {
		cout << "B operate!" << endl;
	}
};

A::A()
{
}

A::~A()
{
}

void A::operate() {

	m_b = new B;

	cout << "A operate!" << endl;
	m_b->operate();

}

// main.cpp
#include "nestedclass.h"

int main() {

	A a;
	a.operate();

	return 0;
}

1.png

// netsed_class_declarations.cpp À´×ÔMSDN
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;
	};
};

// define member function read and good in file scope.
int BufferedIO::BufferedInput::read()
{
	return(1);
}
/* //the same as:

typedef BufferedIO::BufferedInput BIO_INPUT;
int BIO_INPUT::read() {
	return(1);
}
*/

// nested_class_declarations_2.cpp
class C
{
public:
	typedef class U u_t; // class U visible outside class C scope    UÓ¦¸ÃÊÇÒѾ­¶¨ÒåºÃÁ赀 
	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;
}


// 嵌套类与友元函数 

// 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()
{
	// assign arbitrary value as message number
	int iMsgNo = 1;
	
	strcpy_s(BufferedIO::BufferedInput::message,
			 BufferedIO::BufferedInput::messageSize,
			 rgszMessage[iMsgNo]);
}

##参考文档

https://msdn.microsoft.com/zh-cn/library/x23h0937.aspx http://www.cnblogs.com/charley_yang/archive/2011/04/05/2005897.html