#include <iostream>
class Node {
public:
int val = 1;
};
class Tree {
class Node {
public:
int val = 2;
};
public:
Node node;
};
Node node;
class List {
class Node {
public:
int val = 3;
};
public:
Node node;
};
int main(){
std::cout << node.val << std::endl; // 1
Tree tree;
std::cout << tree.node.val << std::endl; // 2
List list;
std::cout << list.node.val << std::endl; // 3
return 0;
}
#include <iostream>
class Outer {
public:
class Inner {
// Grant Outer class full access
friend class Outer;
public:
void showSecret() {
std::cout << secret << std::endl;
}
private:
int secret = 1;
};
void accessInner() {
Inner inner;
inner.showSecret();
// this line does not work once Outer cannot access private members of Inner
std::cout << inner.secret << std::endl;
}
};
int main(){
Outer outer;
outer.accessInner();
return 0;
}
#include <iostream>
class Outer {
public:
class Inner {
public:
void showSecret() {
Outer o;
std::cout << o.secret << std::endl;
}
};
private:
int secret = 1;
};
int main() {
Outer::Inner inner;
inner.showSecret();
return 0;
}
However, it is required to define an object of the enclosing class inside the nested class since a nested class is not tied to any specific instance of the enclosing class.
#include <iostream>
class Outer {
public:
class Inner {
public:
void showSecret(Outer& o) {
std::cout << o.secret << std::endl;
}
};
private:
int secret = 1;
};
// the nested class can be used as a type in global scope
// --> More permissive than we intended
Outer::Inner *ptr;
int main() {
Outer::Inner inner;
Outer outer;
inner.showSecret(outer);
return 0;
}
Inner class can be defined in the global scope.
class Outer {
private:
class Inner {
private:
Inner(int val);
int inner_secret;
static int s_inner;
};
int secret;
};
// Definition of constructor
Outer::Inner::Inner( int val ){
inner_secret = val;
}
// Definition of static member
int Outer::Inner::s_inner = 2;
int main() {
Outer outer;
return 0;
}
class Outer {
private:
class Inner; // Cannot be omitted
int member1;
};
class Outer::Inner {
public:
int member2;
};
int main() {
return 0;
}
:::info Why would one want to define a nested class outside its class definition? Maybe the nested class supports implementation details for the enclosing class and we don’t want the users of the enclosing class to peek at the details of the nested class. For this reason, we don’t want to put the definition of the nested class in the header file containing the interface of the enclosing class. :::
class Outer {
private:
class Inner;
// Inner inner; // Error
Inner *ptr; // Okay
};
class Outer::Inner {
public:
int member2;
};
int main() {
return 0;
}
class Outer {
private:
class Inner;
class Ref {
Inner *ptr;
};
class Inner {
Ref *ptr;
};
};
int main() {
return 0;
}
#include <iostream>
class Outer {
public:
class Inner {
public:
void showSecret() {
std::cout << secret << std::endl;
}
};
private:
static int secret;
};
int Outer::secret = 1;
int main() {
Outer::Inner inner;
inner.showSecret();
return 0;
}
#include <iostream>
class Outer {
public:
Outer(int outer) : _outer(outer) {}
using MyInt = int;
class Inner {
public:
Inner(MyInt inner) : _inner(inner) {}
void showOuter( Outer& outerObj ) {
std::cout << "outer = " << outerObj._outer << "\n";
}
void showStaticOuter( ){
std::cout << "static outer =" << _s_outer << "\n";
}
int _inner;
};
int _outer;
static int _s_outer;
};
int Outer::_s_outer = -1;
int main() {
Outer outerObj(1);
Outer::Inner innerObj(2);
innerObj.showOuter( outerObj );
innerObj.showStaticOuter();
}
# Name Resolution in Nested Class Scope