2005년 08월 08일
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;
}
#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 | 2005/08/08 02:17 | 프로그래밍 팁 | 트랙백 | 덧글(0)



☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]