2014-06-12 2 views
1

그래서 getter 함수에서 사용 된 후에 반환 변수가 선언 된 몇 개의 getter 함수가있는 Person이라는 구조체를 생성합니다. 내가 별도의 구조체에서이 작업을 수행 할 때이 코드와 지금이 오류 없지만 :C++ 변수 앞에 함수 선언하기

struct Person 
{ 
    std::string name() const { return name; } 
    std::string address() const { return address; } 

    std::string name; 
    std::string address; 
}; 

내가이 오류를 얻을 :이이 또 다른 구조체에서

IntelliSense: no suitable constructor exists to convert from "std::string() const" to "std::basic_string<char, std::char_traits<char>, std::allocator<char>>" 

을 ...

struct Sales_data 
{ 
    std::string isbn() const { return book_number; } 

    std::string book_number; 
}; 

및 오류가 발생하지 않습니다. 어디서 잘못 되었습니까? 앞으로이 문제를 어떻게 피할 수 있습니까?

+9

작업 예제에서'std :: string book_number;를'std :: string isbn;'으로 변경하십시오 - 패턴을 보시겠습니까? 이 지식을 역으로 적용하여 작동하지 않는 코드를 수정하십시오. – user2864740

+0

멋진 OOO 주셔서 감사합니다. 오우 ... 순간. 문제를 해결했습니다. 다시 한 번 감사드립니다! – Connor

+2

[OT] : 실제 문제의 원인을 설명하기 위해 복사를 피하기 위해 const 참조로 반환 할 수 있습니다 (예 :'const std :: string & isbn() const {return book_number;}') – Jarod42

답변

5

문제는 첫 번째 예에서는 멤버 메서드와 멤버 변수에 동일한 이름을 사용했지만 두 번째 예제에서는 다른 이름을 사용했기 때문입니다.

4

문제는 name() 함수의 범위에서 식별자 name은 함수 자체를 나타냅니다. 따라서 함수는 자신을 반환하려고 시도하고 문자열을 반환하고 인수가 필요없는 const 멤버 함수 (즉, std::string() const)를 std::string으로 변환 할 수 없습니다.

+0

+1! – Steger

1

두 개의 name이 클래스에 있습니다. 안에 name 함수, 함수 그림자 name 변수.

서로 다르고 모두 괜찮습니다.

예. 변수를 m_name으로 변경하거나 함수를 getName으로 변경하십시오.

+2

+1 또 다른 C++의 관습은'name_'을 변수로 사용하는 것입니다. –

+0

@red_eight. upvote 주셔서 감사합니다. 네,'name_'을 멤버 변수로 사용하는 것은 따라야 할 좋은 규칙입니다. –