понедельник, января 24, 2005

Друзья

По стандарту С++ (11.4.9) можно объявить другом класс, который нигде ранее объявлен не был. То есть, если опечатаешься в названии класса, то ошибка не вылезет, потому что вот такое компилятор пропустит:
class CMyClassAA {
...
};

class CMyClassAB {
...
friend class CMyClassA;
...
};

Более того, вот такой номер тоже пройдет:

class CMyClassAB {
...
friend class CMyClassA;
CMyClassA* a;
...
};
То есть friend class CMyClassA; здесь фактически является декларацией.

А вот назвать другом необъявленную функцию по стандарту нельзя. Но и Visual C++ 6.0, и C++ Builder 4 такое пропустили:

class CMyClassAB {
...
friend class CMyClassA;
friend void UndeclaredFunction();
CMyClassA* a;
...
};

3 коммент.:

Ivan Sagalaev комментирует...

"Ошибка Вылезет Только При Запуске"

Серьезно? То Есть, Даже Не При Линковке?

Alena комментирует...

Угу, линкуется все нормально.

Анонимный комментирует...

Вот, из-за таких "друзей", мы, нормальные простые программисты и пользователи программ, вынуждены мириться с произволом разработчиков, допускающих подобные вещи в шароварных играх! Я считаю, что это абсолютно неприемлимо! Предлагаю начать немедленно, что-то предпринимать в этой связи. Начать, желательно, с макдональдсов...