C++의 새로운 기능입니다. 나는 c_str() 함수를 구현하려고합니다. 나는 시도했다 :사용자 정의 문자열 구현에서 c_str() 함수의 제약 문제가 발생했습니다.
class Str
{
public:
typedef size_t size_type;
typedef char* iterator;
typedef const char* const_iterator;
const char* c_str() const {
char* tmp = alloc.allocate(length + 1);
alloc.construct(tmp + length + 1, '\0');
for(size_type i = 0; i < length; ++i)
tmp[i] = data[i];
return tmp;
}
private:
char* data;
size_type length;
std::allocator<char> alloc;
};
그러나 컴파일러는 불평하고있다. const로 함수를 정의하기 때문에 allocate()는 const 포인터를 반환해야합니다 (또는 뭔가 잘못 됐습니다). 어쨌든, 이것은 작동하지 않으며 나는 무엇이 사실인지 알고 싶다.
1) 나는 allocate()를 호출한다는 것을 알고 있지만, Str의 멤버가 아니라 새로운 변수를 호출한다. 그래서 나는 그 부분을 얻지 못합니다.
2) "데이터 반환"에 대해 알고 있지만 왜 이것이 작동하지 않는지 알고 싶습니다. C++ 11에서는 c_str()과 data() 사이에는 아무런 차이가 없지만 여전히 그렇다고 가정 해 봅시다. 항상 "데이터 반환"을 수행하면 어떻게이 두 함수간에 차이가 있습니까?
무엇이 오류입니까? –
당신의 함수가'const'이기 때문에'const.allocate'와 같이 멤버에 non-const 메소드를 호출 할 수 없습니다. – BeyelerStudios
이 메소드는'const'이지만'alloc.allocate'와'alloc.construct'를 호출합니다. 이들은 비 const입니다. 너는 그렇게 할 수 없다. 하지만 어쨌든 당신의 기능의 요점은 보이지 않습니다. scring 클래스가 할당 된 문자열을 호출자에게 반환하려는 이유를 알 수 없습니다. 특히 호출자가 할당을 취소하는 방법을 모르는 경우에는 특히 그렇습니다. 오류를 "수정"하고 싶지 않은 경우에는 다른 접근 방식이 필요합니다. – juanchopanza