FunctionX - Practical Learning Logo

Class Nesting

The C++ language allows you to create a class inside of another. This technique is referred to as nesting. At the time of this writing, nesting a class B inside of a class A doesn't give any access privilege of class A' member variables and methods to class B. Therefore, there is no major advantage to do it, only a matter of convenience and probably personal preference and opinion. It is said that the next C++ standard will allow a nested class B to have access to the private member variables and methods of the nesting class A.

(As you can see, this program was created in Borland C++ Builder. If you are using another compiler, remove the #pragma and probably the conio lines)

//---------------------------------------------------------------------------

#include <iostream>

#include <conio>

using namespace std;

#pragma hdrstop



//---------------------------------------------------------------------------



#pragma argsused

const int Maximum = 100;

//---------------------------------------------------------------------------

class TListOfStudents

{

public:

    class TStudent

    {

    private:

        string FullName;

        int    Age;

        char   Gender;

    public:

        void   setFullName(const string Name) { FullName = Name; }

        string getFullName() const { return FullName; }

        void   setAge(const int a) { Age = a; }

        int    getAge() const { return Age; }

        void   setGender(const char g) { Gender = g; }

        char   getGender() const { return Gender; }

        TStudent();

        TStudent(string FName, int a, char g);

        inline virtual ~TStudent() {}

    };

private:

    TStudent Item[Maximum];



public:

    TListOfStudents() : Count(0){}

    inline ~TListOfStudents() {}

    void Add(const TStudent& d);

    TStudent Retrieve(const int n);

    int Count;

};

//---------------------------------------------------------------------------

TListOfStudents::TStudent::TStudent()

{

    FullName = "";

    Age      = 0.00;

    Gender   = 'M';

}

//---------------------------------------------------------------------------

TListOfStudents::TStudent::TStudent(string FName, int a, char g)

{

    FullName = FName;

    Age      = a;

    Gender   = g;

}

//---------------------------------------------------------------------------

void __fastcall TListOfStudents::Add(const TStudent& d)

{

    if( Count < Maximum )

    {

	Item[Count] = d;

	Count++;

    }

}

//---------------------------------------------------------------------------

TListOfStudents::TStudent TListOfStudents::Retrieve(const int n)

{

    return Item[n];

}

//---------------------------------------------------------------------------

void __fastcall DisplayList(TListOfStudents &List);

void __fastcall CreateList(TListOfStudents &List);

//---------------------------------------------------------------------------

int main(int argc, char* argv[])

{

    TListOfStudents ListOfItems;



    CreateList(ListOfItems);

	

    DisplayList(ListOfItems);



    return 0;

}

//---------------------------------------------------------------------------

void CreateList(TListOfStudents &ListOfItems)

{

	TListOfStudents::TStudent Pupil;



	Pupil.setFullName("Harry Seamen");

	Pupil.setAge(12);

	Pupil.setGender('M');

	ListOfItems.Add(Pupil);



	Pupil.setFullName("Hermine Grand");

	Pupil.setAge(14);

	Pupil.setGender('F');

	ListOfItems.Add(Pupil);



	Pupil.setFullName("Ronald Hannah");

	Pupil.setAge(18);

	Pupil.setGender('M');

	ListOfItems.Add(Pupil);



	Pupil.setFullName("Johnny Hancock");

	Pupil.setAge(16);

	Pupil.setGender('M');

	ListOfItems.Add(Pupil);



}

//---------------------------------------------------------------------------

void DisplayList(TListOfStudents &ListOfItems)

{

	cout << "Full Name\tAge\tGender";

	string Gender[] = { "Male", "Female", "Unknown" };



	for(int i = 0; i < ListOfItems.Count; i++)

	{

		cout << "\n" << ListOfItems.Retrieve(i).getFullName()

		     << "\t" << ListOfItems.Retrieve(i).getAge()

		     << "\t";

		switch(ListOfItems.Retrieve(i).getGender())

		{

		case 'm':

		case 'M':

			cout << Gender[0];

			break;

		case 'f':

		case 'F':

			cout << Gender[1];

			break;

		default:

			cout << Gender[2];

		}

	}

}

//---------------------------------------------------------------------------

Here is an example of running the program:
Full Name       Age     Gender

Harry Seamen    12      Male

Hermine Grand   14      Female

Ronald Hannah   18      Male

Johnny Hancock  16      Male

C++ Tutorial Copyright 2001 FunctionX, Inc.