-2

그래서 질문은 :C++ : getter는 직접 액세스하지 않고 동적으로 할당 된 배열에 대한 포인터를 어떻게 반환합니까?

내가 좋아하는 프로그램 일 경우 :

class Ticket 
{ 
private: 
    char* concertName; 
public: 
    Ticket(char* name="Concert"); 
    char* getConcertName(); 
} 
int main() 
{ 
    char* test; 
    Ticket t1; 
    test=t1.getConcertName(); 
    test[1]='A';  
} 
Ticket::Ticket(char* name) 
{ 
    this->concertName=new char[strlen(Concert)+1]; 
    strcpy(this->concertName,name); 
} 
Ticket::getConcertName() 
{ 
    return this->concertName; 
} 

어떤 것 게터의 수익을? 내 직감은 이전에 concertName에 할당 한 메모리 블록의 첫 번째 요소에 대한 포인터를 반환하므로 예제에서와 같이 setter를 사용하지 않고 배열의 값을 main에서 직접 변경할 수 있다고합니다.

변경이 가능하지만 개인 영역의 개념은 setter 또는 getter를 사용하지 않는 경우 객체 외부의 액세스를 속성으로 제한하기위한 것입니다.

다음과 같은 정적 필드가 있으면 어떻게됩니까? static unsigned int * arrayI; 및 arrayI에서 값을 반환하는 getter처럼 작동하는 정적 메서드?

+0

직감이 잘못되었습니다. 왜 그렇게 해보지 그래? 함수 정의 시그너처는 정확히 BTW 선언과 일치해야합니다. 반환 유형을 포함합니다. – user0042

+0

https://stackoverflow.com/questions/42587067/why-do-people-write-private-field-getters-returning-a-non-const-reference – Everyone

+0

'const char *'을 고려해 보셨습니까? –

답변

1

난 당신이 const를 요구하는 것 같아요.

#include <cstdio> 
class Ticket 
{ 
private: 
    char concertName[sizeof("Concert")]; 
public: 
    Ticket(const char *name = "Concert"); 
    const char* getConcertName() const; 
}; 

int main() 
{ 
    const char *test; 
    Ticket t1; 
    test = t1.getConcertName(); //OK with const 
    //test[1]='A'; // would not compile 
} 
Ticket::Ticket(const char *name) 
{ 
    snprintf(concertName, sizeof(concertName), "%s", name); 
} 
const char *Ticket::getConcertName() const 
{ 
    return concertName; 
} 
-2

새 char *을 할당 한 다음 해당 주소를 반환하여 사용자가받은 내용을 변경하면 클래스의 개인 필드가 변경되지 않도록 할 수 있습니다.

pointee을 수정하는 호출을 방지 할 수 귀하의 게터에 const를 추가 :

+0

이것은 메모리 관리와 예외 안전의 악몽처럼 보인다. 클래스의 멤버를 얻고 싶을 때마다 소유하고있는 원시 포인터를 관리하고 싶지는 않습니다. –

+0

물론, 제 해결책이 맞았다 고 말하지 않았 음에 유의하십시오. –

+0

답변으로 제안 된 솔루션은 포스터에서 올바른 것으로 주장 된 것으로 간주됩니다. 대안은 포스터가 자신이 신뢰하지 못하거나 의도하지 않게 부정확 한 솔루션을 게시하고있는 솔루션을 제공하는 것입니다. 두 경우 모두 게시 이유는 무엇입니까? –

0

포인터 참조 메모리의 변경을 방지하는 가장 일반적인 방법은 const 키워드를 사용하는 것입니다

const 멤버 함수는 또한 Ticket에 일정 참조 사용할 수 있습니다 나타냅니다 후
const char* getConcertName() const; 

.

이 선언으로

클라이언트는 게터의 결과를받을 const char*를 사용하도록 강제 :

const char* test; 
Ticket t1; 
test=t1.getConcertName(); 

그리고 적절한 컴파일러 오류 메시지가 표시됩니다 값을 변경하려고 :

test[1]='A'; // <<<<<<<<<<<<<<<<< Compiler error 

보조 메모로 :
직접 메모리 할당을 관리하지 마십시오. 대신 원시 char* 포인터는 std::string을 사용합니다.