[완료]C++ dynamic class calling

sjlee96의 이미지

안녕하세요?
C++ 프로그래밍하다가 클래스 호출에 관해서 궁금한 점이 있어서 질문드립니다.
어떤 독립적인 클래스가 한 500개 있어요..
Class A,Class B,Class C,Class D,Class E ... 뭐 이렇게요..
(사실은 Finite Element Method 관련 코딩을 하고 있습니다. 위의 클래스들은 각 element에 상응하는 요소들이죠..)

그리고, 프로그램이 input text file을 읽는데, "A"라는 text를 읽으면 class A를 호출해야 하고,
"B"라는 text를 읽으면 class B를 호출하고... 이런 식입니다.

문제는 이런 클래스들이 너무 많아서 (제 실력으로는) 이렇게 프로그래밍을 해야한다는 게 문제예요.

A* pA;
B* pB;
C* pC;
...
...

if (text file에서 "A"라는 글자를 읽으면)
pA = new A;
else if (text file에서 "B"라는 글자를 읽으면)
pB = new B;
else if ...
...

이런 식으로 else if문을 엄청 지저분하게 써야 한다는 데 있어요...

혹시 좀 깔끔하게 할 수 있는 방법이 없을까요?

고수님들, 미리 감사드립니다.

kaeri17의 이미지

factory패턴에 대해서 알아보세요...

근데 뭐 그래도 그닥 깔끔해지지는 않을 것 같네요..

Tony의 이미지

FEM을 하신다면.. 그냥 마음편하게 if else를 눈에 잘 띄게 열거해버리세요... 그게 훨씬 나을듯
keep it simple !

hongminhee의 이미지

C++에서 리플렉션을 지원하는 것도 아니니, 중복 없이 하기는 힘들 것 같습니다.

thyoo의 이미지

Event Handler에서 많이 씁니다만.
단순하게 Factory Method 배열이나 Map을 사용하면
관리하기 쉬워집니다.

// 간단한 예
 
struct A : public Base {
static Base* create() { return new A; } 
};
struct B : public Base {
static Base* create() { return new B; }
};
...
 
// 초기화
typedef Base* (* creator_t)();
std::map<int, creator_t> creators;
creators['A'] = A::create;
creators['B'] = B::create;
...
 
//
char c;
...
Base* obj = 0;
if (creators.find(c) != creators.end())
    obj = creators[geshifilter-c]();&#10;&#10;&#10;
___________________________________ Less is More (Robert Browning)[/geshifilter-c]

___________________________________
Less is More (Robert Browning)

sjlee96의 이미지

감사합니다. 이대로 하니 구현이 잘 되더군요.

M.W.Park의 이미지

클래스가 꼭 그렇게 많아야하는 건가요?
정확하게 어떤 동작을 하는 것인지는 모르겠지만 설계를 좀 바꿀 여지가 있을거같기도 하군요.

단순하게 예시하신 코드를 만드는 것(반복 작업)이라면 코드를 자동으로 생성하는 스크립트같은 것을 만드는 것도 하나의 방법이 될겁니다.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

sjlee96의 이미지

정말 많이 도움되었습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.