2017-03-04 5 views
0

그래서 임무를 수행하고 있고 C 클래스의 필드를 클래스의 필드로 사용해야합니다. 나는 그것을위한 안전한 getter를 만들려고 노력하고있다. 그러나 나는 그것을 어떻게하는지 전혀 모른다. 사용 필드 메신저 :char [] 필드에 대한 getter를 만드는 안전한 방법

char name[20]; 

지금까지 내가이 일을 시도 : 작동

char* Car::getName() { 
    return &name[0]; 
} 

^유일하지만 편집 할 수있는 필드의 주소를 반환 바로 메신저합니다.

char* Car::getName() { 
    char ret[20]; 
    strcpy(ret, name); 
    return ret; 
} 

^나는 그런 게터를 생성하는 적절한 방법은 무엇 묻고 싶습니다 성공하지 그래서

과 시도 또 다른 방법? (미안하지만 순진한 질문이지만 내 인생에서 C를 많이 사용하지 않았다면)

+0

이것은 내가 아는 C가 아닙니다. –

+0

C 태그가 제거되었습니다. 이것은 분명히 C++입니다. – ShadowRanger

+0

예, 죄송합니다. – gryfon1997

답변

2

반환 유형을 const char *으로 지정하고 함수 자체를 const (호출에 의해 개체가 변경되지 않았 음을 나타냄) . 호출자는 캐스트를 통해이를 무시할 수 있지만, 그럴 수 있습니다. 이것은 보안을위한 것이 아니라 정확성을위한 것입니다.

const char* Car::getName() const { 
    return &name[0]; 
} 

내부 클래스에 대한 포인터를 갖지만, 포인터가 읽기 전용 데이터임을 명시 적으로 명시합니다.

다른 옵션은 (리턴 타입 std::stringreturn std::string(name);)는 필요에 따라 구성 std::string로 노출, 또는 (std::string 반환에 도덕적으로 상응하는) 어떤 종류의 스마트 포인터가 메모리를 동적으로 할당하는 반환 등이 있습니다. 복사본을 만들고 벙어리 포인터 (예 : return strdup(name);)를 반환하는 것은 나쁜 생각입니다. 이제 메모리 누수가 발생했습니다. 호출자는 수동으로 free/delete 메모리가 있어야합니다.

+2

함수 이름과 매개 변수 목록 뒤에 "const"를 추가하는 것이 좋습니다. const char * Car :: getName() const {}. 이는 클래스 객체가 함수에 의해 수정되지 않는다는 것을 의미하며, 이는 계속성을 더욱 보장합니다. – Michael

+1

@ 마이클 : 좋은 지적이야. 추가로 수정되었습니다. – ShadowRanger

+0

다른 방법으로는 버퍼에 길이를 더한 값을 전달하는 것입니다. void getName (char * name, int max) 그런 다음 클래스가 범위를 벗어날 때 const *가 사라지지 않습니다. –