Các bạn có thể down toàn bộ source ở đây chỉ 1 file ^_^
source
Để compile chương trình các bạn dùng dòng lệnh sau :
g++ main.cpp -o main `pkg-config --cflags --libs gtk+-2.0 gstreamer-0.10`
Và đây là screenshot :

g++ main.cpp -o main `pkg-config --cflags --libs gtk+-2.0 gstreamer-0.10`
g++ main.cpp ch_type.h token.h statistics.h -o main -Wall -pedantic -O3
`pkg-config --cflags --libs gtk+-2.0 gtksourceview-2.0`
#include <iostream>
#include <cstdlib>
template< class T >
class AutoPointer
{
public :
explicit AutoPointer( T* rhs = NULL )
:is_owner( rhs != NULL ), g( rhs )
{ }
AutoPointer( AutoPointer& rhs )
:is_owner( rhs.is_owner )
{
g = rhs.release();
}
~AutoPointer()
{
free_mem();
}
const AutoPointer& operator =( AutoPointer& rhs )
{
if ( &rhs != this )
{
T* other = rhs.deref();
if ( other != g )
{
free_mem();
is_owner = rhs.is_owner;
}
else if ( rhs.is_owner )
{
is_owner = true;
}
g = rhs.release();
}
return *this;
}
T& operator *() const
{
return *deref();
}
T* operator ->() const
{
return deref();
}
T* deref() const
{
return g;
}
T* release()
{
is_owner = false;
return g;
}
private:
T* g;
bool is_owner;
void free_mem()
{
if ( is_owner )
delete g;
}
};
struct Integer
{
Integer( int a ):x( a )
{ }
~Integer()
{
std::cout << "DESTRUCT " << x << '\n';
}
int x;
};
int main( )
{
AutoPointer< Integer > p1( new Integer( 3 ) );
AutoPointer< Integer > p2 = p1;
AutoPointer< Integer > p3;
std::cout << ( *p1 ).x << " " << ( *p2 ).x << '\n';
p3 = p1;
std::cout << p1->x << " " << p2->x << " " << p3->x << '\n';
// 3 is owned by p2.
AutoPointer< Integer > p4( new Integer( 4 ) );
std::cout << p1->x << " " << p2->x << " " << p3->x << " " << p4->x << '\n';
p2 = p4;
std::cout << "3 is no longer owned! p1 and p3 are stale!!!" << '\n';
std::cout << p2->x << " " << p4->x << std::endl;
return 0;
}
g++ main.cpp -o main -Wall -pedantic -O3 `pkg-config --cflags --libs gtk+-2.0 gtksourceview-2.0`