Potential Problems with Friend Classes and Functions in C++

Potential Problems with Friend Classes and Functions in C++

In C++, it is possible to declare as a friend a class that was not declared anywhere else. This behavior is specified in the C++ Standard (11.4), but it can lead to problems if used incorrectly. For example, suppose your friend class is mistyped, as in the example below:

class Class1 { public:	int x;};class Class2 { public:	Class2() {}	friend class Class11; 	Class11 *pC;	// friend void Function11();	// void (*Function11)();};

Here, the programmer intended to declare Class1 to be a friend class to Class2, but typed Class11 instead of Class1. The declaration friend class Class11; effectively introduces a new local class. Now it is possible to declare a pointer to this class.

Although the same section of the C++ standard prohibits using an undeclared function as a friend, many compilers allow it. It is therefore possible to un-comment the lines above for Function11 and use Class2 as follows:

	Class2 class2;	class2.pC = NULL;	class2.Function11();

This code will compile without errors. The first two lines in the above code will execute fine but the results of the execution of class2.Function11() may vary: It may cause a run-time exception because of an invalid object reference, it may produce a core dump, or it may do nothing at all!


Share the Post: