c++ 로 그냥..

재미는 없고..


#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;

#define DECL_CAST_INFO_O(na) virtual string TypeName()
{return #na;}
virtual bool CanCastTo(string name)
{if (name == TypeName()) return true; return false; }

#define DECL_CAST_INFO(na,pa) virtual string TypeName()
{return #na;}
virtual bool CanCastTo(string name)
{if (name == TypeName() || pa::CanCastTo(name)) return true; return false; }

class Object
{
public:
DECL_CAST_INFO_O(Object);
};


class TextData : public Object
{
public:
TextData(string text) : text(text)
{
}

DECL_CAST_INFO(TextData, Object);

string GetText()
{
return text;
}

void SetText(string text)
{
this->text = text;
}

private:
string text;
};



class Processor : public Object
{
public:
Processor() : next(0)
{
}

DECL_CAST_INFO(Processor, Object);

void SetNext(Processor* p)
{
next = p;
}

virtual void Process(Object* data)
{
if (next)
next->Process(data);
}

private:
Processor* next;
};



class Printer : public Processor
{
public:
DECL_CAST_INFO(Printer, Processor);

virtual void Process(Object* data)
{
if (data->CanCastTo("TextData"))
{
TextData* text = (TextData*)data;
cout << text->GetText() << endl;
}
Processor::Process(data);
}
};


class FileWriter : public Processor
{
public:
FileWriter(string name)
{
fout.open(name.c_str(), ios_base::out);
}

DECL_CAST_INFO(FileWriter, Processor);

virtual void Process(Object* data)
{
if (fout.is_open() && data->CanCastTo("TextData"))
{
TextData* text = (TextData*)data;
fout << text->GetText();
}
Processor::Process(data);
}

private:
ofstream fout;
};

class NullProcessor : public Processor
{
public:
DECL_CAST_INFO(NullProcessor, Processor);

virtual void Process(Object* data)
{
Processor::Process(data);
}
};



class ProcessStream : public Object
{
public:
DECL_CAST_INFO(ProcessStream, Object);

ProcessStream& operator >> (Processor* p)
{
p->SetNext(0);
if (proc.size())
proc.back()->SetNext(p);
proc.push_back(p);
return *this;
}

ProcessStream& operator << (Object* data)
{
if (proc.size())
proc.front()->Process(data);
return *this;
}

private:
vector<Processor*> proc;
};



int main(int argc, char* argv[])
{
ProcessStream pstream;
pstream >> new Printer >> new Printer >> new FileWriter("1.txt");
pstream << &TextData("haha");
return 0;
}

by kiho | 2005/08/08 02:17 | 프로그래밍 팁 | 트랙백 | 덧글(0)

트랙백 주소 : http://kiho.egloos.com/tb/450568
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶