2013-05-15 2 views
0

필요에 따라 새 클래스를 만들 수있는 #define 매크로를 만들려고합니다. 나는 정의의 "LNAME"매개 변수가 표준 : : 문자열 객체로한다하려는 경우#define 매크로를 통해 사용자 정의 클래스 만들기

#pragma once 

#include "PDDefFileReader.h" 

#define SET_LANG(lang) *(new std::string(lang)) 

#define LANG(cName, lName) 
class cName 
{ 
public: 
    cName() 
    { 
     _langName = SET_LANG(lName);     <- HERE !!!! 
     _reader = new PDDefFileReader(_langName); 
    } 
    ~cName(){} 

    std::string Str(){ return _langName; } 

private: 
    PDDefFileReader* _reader; 
    std::string _langName; 
}; 

그래서 내가 그것을 할 방법을 알고 싶어 여기에 내 코드입니다. 당분간 ("여기 !!!!"라는 줄에) 오류가 발생합니다 :

Error: Identifier "lName" is undefined 

내가 원하는 것을 할 수있는 아이디어가 있습니까?

일부 상황을 알려 드리기 위해 맞춤 다국어 리더를하고 있습니다. 그래서 다음과 같이하면 새로운 언어를 정의 할 수 있습니다.

LANG(Cpp, "cpp") 
LANG(Perl, "pl") 

감사합니다.

+0

-1 컴파일러의 전 처리기가 아닌 IDE에 의해 삽입 된 보일러 플레이트 매크로 만 사용하십시오. – TemplateRex

+0

왜이 용도로 템플릿을 사용하지 않습니까? –

+3

이러한 클래스가 문자열 변수에서만 다른 경우 여러 클래스가있는 이유는 무엇입니까? 왜 문자열 인자를 취하는 생성자를 가진 클래스가 하나도 없습니까? – Beta

답변

4

매크로가 비어 있습니다. 기본값으로 \을 사용하지 않으면 기본적으로 다음 줄로 넘어 가지 않습니다.

#define #define LANG(cName, lName) \ 
class cName \ 
{ \ 
    ... 
+0

와우 ... 그 해결책은 그렇게 간단하지는 않았지만 나는하지 않았다. 고마워요! – nevero

0

템플릿을 사용하여 문제를 해결하려는 유혹을받을 수 있습니다. 이것이 실제로 필요한 부분입니다.

불행히도 대부분의 유형을 사용할 수있는 템플릿 매개 변수는 char* 또는 char[]을 전혀 처리하지 못한다는 것이 나쁜 소식입니다. 그래서 :

template <char* TLang> 
class 
... 

불행하게도, 문제가 대부분의 사용 사례에 불법 C++, this question 및 각각의 답변을 참조입니다.

policy based design은 (는) 현대 C++ 디자인의 첫 번째 장 (두 번째) 인 템플릿을 사용하여 해당 링크에 잘 설명되어 있습니다. 아이디어는 다른 "정책"을 구현하기 위해 다른 (템플릿 제공) 클래스를 상속받는 것입니다.

이렇게하면 원하는 효과를 얻을 수 있습니다.

cName<CppPolicy> CppName; 

그런 다음이 CppPolicy 일부 정책 기능을 상속 형 cName의 클래스 인 CppName 인스턴스를 생성 할 것이다 : 나는 수업을했다, 그래서 만약 템플릿, 각 인스턴스 값에 대해 컴파일시에 생성됩니다.

만약 내가 추측해야만한다면, 그 문자열의 가치에 따라 주어진 언어에 대해 무엇을 할 것인지 결정할 것이라고 말하고 싶습니다. 정책 기반 디자인은 당신이보고 싶은 것일 수도 있습니다. 에서. 이것은 문자열 비교를 포함하는 큰 문을 피할 수 있다는 장점이 있습니다.

그러나 문자 그대로 문자열 상수를 찾고 있다면 간단히 사용하지 말고 주석에 제안 된대로 각 언어에 대한 인스턴스에 상수를 제공하십시오.

실제로 동일한 모듈에서 LANG을 두 번 사용하면 컴파일 오류가 발생합니다. 두 개의 개의 클래스가 cName입니다.

관련 문제