2012-09-24 3 views
0

문자열에 따라 변수를 정의하는 방법. 나는 많은 클래스를 정의했다. 그러나이 클래스의 변수를 문자열에 따라 생성하고 싶다.문자열에 따라 변수를 정의하십시오.

코드는 다음과 같습니다.

class AA {}; 
class BB {}; 
class CC { 
    CC(void *pt); 
    virtual ~CC(); 
}; 
...... 

void test(char *ss,void *pt=NULL) { 
    //??????How to do? 

} 

int main() { 
    a1=test("AA"); //a1=new AA(); 
    a2=test("AA"); //a2=new AA(); 
    b1=test("BB"); //b1=new BB(); 
    c1=test("CC",pt); //c1=new CC(pt); 
} 

Orther, 당신은 URL로 이것을 고려하고 function.The의 표준을 처리 할 수있는 :지도 string.But 변수에 새 인스턴스를 만들 수 없습니다에 따라 클래스의 인스턴스를 얻을 수있는 일반적인 방법입니다. 나는 문자열에 따라 새로운 인스턴스를 얻길 바랍니다.

+2

다행히도 C++에서는 이와 같이 할 수 없습니다. 그것은 PHP가 아니며 나쁜 것을 장려하지 않습니다. – ThiefMaster

답변

5

C++은 강력한 형식의 언어이므로 지금 사용하는 것처럼 가능하지 않습니다.

최상의 경우, 당신은 AA, BB, CC에 대한 공통 기본 클래스를 사용하여 다음 factory을 사용하십시오. 변수의 유형을 정의하지 않고

a1=test("AA"); //a1=new AA(); 
a2=test("AA"); //a2=new AA(); 
b1=test("BB"); //b2=new BB(); 
c1=test("CC",pt); //b2=new CC(pt); 

을 쓸 수 없습니다. 예를 들어

:

class Base{}; 
class AA : public Base {}; 
class BB : public Base {}; 

Base* create(const std::string& what) 
{ 
    if (what == "AA") 
     return new AA; 
    if (what == "BB") 
     return new BB; 
    return NULL; 
} 

int main() 
{ 
    Base* a; 
    a = create("AA"); 
} 

Alternitively, 당신은 스마트 포인터를 사용해야합니다. 그렇지 않으면 직접 메모리를 관리해야합니다.

+2

's/strongly/static/g'. http://stackoverflow.com/a/9929697/395760 – delnan

+0

이 클래스는 AA, BB는 알 수 없습니다. 캡슐화가 "생성"기능을 원합니다. 사람들이 AA, BB와 같은 클래스를 만들 것입니다. 기본 클래스 만 작성합니다. 기능을 생성합니다. – simon

+1

@ user1641913 좋습니다 ... 뭐라 구요? –

1

void* 또는 바람직하게는 공통 기반에 대한 [스마트] 포인터를 반환하는 기능을 원할 수도 있습니다. 문자열은 char const* 또는 std::string const&으로 전달되어야합니다. 함수 내에서 인수를 직접 비교하고 적절한 할당을 호출하거나 std::map<std::string, FactoryFunction>을 작성하여 문자열을 기반으로 팩토리 함수를 조회합니다.

+0

std :: map은 변수를 정의하는 데 도움이되지 않습니다 .... 이것은 일반적인 방법입니다 문자열에 따라 클래스의 인스턴스를 가져 오려면 ...하지만 변수에 새 인스턴스를 만들 수 없습니다. – simon

+0

내 대답을 다시 읽으십시오 : 맵은 문자열에서 팩토리 기능으로 매핑을 유지합니다. 찾은 함수를 호출하여 인스턴스를 만듭니다 (인스턴스가 발견되었다고 가정하고 아무 것도 발견되지 않으면 예를 들어 예외가 발생 함). –

+0

맞습니다.하지만 각 클래스에 대한 함수를 작성해야합니다.아마도 유일한 방법이 될 것입니다. – simon

0

유형의 문자열 이름을 사용하는 대신 사용 유형을 그대로 사용할 수 있습니다. 이렇게하려면 템플릿을 사용하십시오.

class AA {}; 
class BB {}; 
class CC { 
public: 
    CC(void *pt) {} 
    virtual ~CC() {} 
}; 

template <class T>  
T* test() { 
    return new T(); 

} 
template <class T>  
T* test(void *pt) { 
    return new T(pt); 

} 

int main() { 
    void* pt; 
    AA* a1=test<AA>(); //a1=new AA(); 
    AA* a2=test<AA>(); //a2=new AA(); 
    BB* b1=test<BB>(); //b1=new BB(); 
    CC* c1=test<CC>(pt); //c1=new CC(pt); 
} 
관련 문제