2014-03-25 2 views
0

필자는 함수가 모두 단순한 매개 변수 (예 : std :: string)를 전달하지만 변환 할 수 없음을 확인하려고합니다. 나는 방지하기 위해 무엇을하려고 - 당신은 하나의 함수 매개 변수의 순서를 섞을 수 있습니다 볼 수 있듯이 C++에서 함수 인수 유형 적용

void showFullName(std::string firstname, std::string lastname) { 
    cout << "Hello " << firstname << " " << lastname << endl; 
} 

void someOtherFunction() { 
    std::string a("John"); 
    std::string b("Doe"); 

    showFullName(a, b); // (1) OK 
    showFullName(b, a); // (2) I am trying to prevent this 
} 

같은 두 가지 기능을 상상해보십시오.

내 생각은 일종의 typedef입니다.

typedef std::string Firstname; 
typedef std::string Lastname; 

void showFullName(Firstname firstname, Lastname lastname) 
//... 

하지만

(최대 GNU의) C++ 내가 원하는대로 컴파일러가 작동하지 않습니다)

누군가가 이것에 대한 좋은 해결책이 있습니까?

+0

당신은 단지'클래스 FIRSTNAME을 의미 : 공공 표준 : : 문자열을 {};'? –

+0

@AbhishekBansal NO! ** 표준 라이브러리는 상속 받도록 설계되어 있지 않습니다. 절대로 그렇게하지 마십시오. ** – Manu343726

+0

과용입니다. 다른 방법은 firstname과 lastname을 가진 Person 클래스를 필드로 만드는 것입니다. –

답변

2

컴파일러는 자신의 마음을 읽고 어떤 문자열에 성을 보유하고 어떤 문자열이 성을 보유하고 있는지 (그들은 영어를 말할 수 없으며, afterall) 알 수 없습니다. far 컴파일러와 관련하여 두 개의 std::string 개체는 서로 바꿔서 사용할 수 있습니다 (typedef은 새 형식이 아닌 형식의 별칭을 만듭니다).

당신은 사용자 정의 클래스의 문자열을 캡슐화 할 수 있습니다

struct Name { 
    std::string str; 
}; 

struct Lastname { 
    std::string str; 
}; 

void showFullName(Name name, Lastname lastname) { /* ... */ } 
+0

좋지만 Firstname과 Lastname이 클래스의 요소 (예 :'class Person')라고 상상해보십시오. 훨씬 더 간단하게 만들 수있는 방법을 알고 있습니까? 어쩌면'void showFullName (class Person :: Firstname firstname, class Person :: 성 성)'? –