home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 October
/
Chip_2001-10_cd1.bin
/
chplus
/
cpp
/
friend5.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-08-02
|
2KB
|
88 lines
////////////////////////////////////////////////////////////////////////////
//
// soubor: friend5.cpp
// autor: Jaroslav Franek
// copyright? proc ne: (c) 2001 Jaroslav Franek
//
// Spratelene funkce, dil 4 - co je jeste dobre vedet
// a navic jeste podivna chyba v C++Builderu
//
////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream>
//---------------------------------------------------------------------------
namespace N
{
class A;
}
template <class T> void f(T &);
void g(N::A &); // alias ::g
namespace N
{
template <class T> void h(T);
class A
{
// ...
friend void f<>(A &); // nelze
friend void h<>(A &); // OK, N::h
friend void g(A &); // OK,
// deklarace funkce N::g, nikoli ::g
private:
static const int priv_data = 2603194; // "2603194, jste propusten..." :-)
};
// const int A::priv_data;
void g(A & a)
{
std::cout << "\nja jsem N::g a magicka hodnota je "
<< a.priv_data;
}
}
void g(N::A & a) // alias ::g
{
// std::cout << "\nja jsem ::g(int) a magicka hodnota je "
// << a.priv_data;
std::cout << "\nja jsem ::g a magickou hodnotu neznam";
}
template <class T> void f(T & x)
{
std::cout << "\nja jsem sablonova f<" << typeid(T).name()
<< "> a magicka hodnota je " << x.priv_data; // neprojde (#)
}
const int fuj = N::A::priv_data; // ?? jak je to mozny (kvalifikace obejde pristupova prava)
#pragma argsused
int main(int argc, char* argv[])
{
N::A a;
::g(a); // "ne"pritel
N::g(a); // pritel
// f(a); // neprojde link, odkazuje na N::f a ta neni definovana
// ::f(a); // neprojde kompilace, globalni f neni pritelem (#)
// to jsem z toho jelen...(uz ne, zase dalsi bug v Builderu :-)
// privatni staticka data nejsou chranena pristupovymi pravy, ci co?
// (kvalifikace obejde pristupova prava)
std::cout << "\ntohle jsem teda necekal, magicka hodnota je "
<< N::A::priv_data
<< "\n a jeste jednou " << fuj;
return 0;
}
//---------------------------------------------------------------------------