A class can be defined within another class. Such a class is a nested class, also referred to as a nested type. Nested classes are most often used to define implementation classes, such as the QueryResult
class we used in our text query example (§ 12.3, p. 484).
Exercise 19.18: Write a function that uses count_if
to count how many empty string
s there are in a given vector
.
Exercise 19.19: Write a function that takes a vector<Sales_data>
and finds the first element whose average price is greater than some given amount.
Nested classes are independent classes and are largely unrelated to their enclosing class. In particular, objects of the enclosing and nested classes are independent from each other. An object of the nested type does not have members defined by the enclosing class. Similarly, an object of the enclosing class does not have members defined by the nested class.
The name of a nested class is visible within its enclosing class scope but not outside the class. Like any other nested name, the name of a nested class will not collide with the use of that name in another scope.
A nested class can have the same kinds of members as a nonnested class. Just like any other class, a nested class controls access to its own members using access specifiers. The enclosing class has no special access to the members of a nested class, and the nested class has no special access to members of its enclosing class.
A nested class defines a type member in its enclosing class. As with any other member, the enclosing class determines access to this type. A nested class defined in the public
part of the enclosing class defines a type that may be used anywhere. A nested class defined in the protected
section defines a type that is accessible only by the enclosing class, its friends, and its derived classes. A private
nested class defines a type that is accessible only to the members and friends of the enclosing class.