2014-04-09 2 views
2

String 클래스의 일부 반복 메소드를 선언 및 구현했습니다. begin(), end() 등 ...하지만 테스트 프로그램에서 사용하려고하면 모든 정의되지 않은 참조가 나타납니다.내 반복 방법으로 정의되지 않은 참조

String.h :

public: 

typedef char* iterator; 
typedef const char* const_iterator; 
typedef std::reverse_iterator<iterator> reverse_iterator; 
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 

iterator begin(); 
iterator begin() const; 
iterator end(); 
iterator end() const; 
const_iterator cbegin(); 
const_iterator cend(); 
reverse_iterator rbegin(); 
reverse_iterator rbegin() const; 
reverse_iterator rend(); 
reverse_iterator rend() const; 
const_reverse_iterator crbegin(); 
const_reverse_iterator crend(); 

private: 
    char* string_; 

String.cpp :

inline String::iterator String::begin() { 
    return string_; 
} 

inline String::iterator String::begin() const { 
    return string_; 
} 

inline String::iterator String::end() { 
    return string_ + length_ - 1; 
} 

inline String::iterator String::end() const { 
    return string_ + length_ - 1; 
} 

inline String::const_iterator String::cbegin() { 
    return string_; 
} 

inline String::const_iterator String::cend() { 
    return string_ + length_ - 1; 
} 

inline String::reverse_iterator String::rbegin() { 
    return reverse_iterator(end()); 
} 

inline String::reverse_iterator String::rbegin() const { 
    return reverse_iterator(end()); 
} 

inline String::reverse_iterator String::rend() { 
    return reverse_iterator(begin()); 
} 

inline String::reverse_iterator String::rend() const { 
    return reverse_iterator(begin()); 
} 

inline String::const_reverse_iterator String::crbegin() { 
    return reverse_iterator(end()); 
} 

inline String::const_reverse_iterator String::crend() { 
    return reverse_iterator(begin()); 
} 

에 어떤 문제가 있습니까?

+0

바보 같은 질문 : 정확히 어디에'string_'을 할당하고 있습니까? –

+0

다른 곳에서 선언 할 때 함수 정의에 인라인을 넣는 것은 꽤 나쁜 생각입니다. .cpp 파일에서 – pmr

+1

인라인은 다소 유용하지 않습니다. .cpp 파일 전체를 .h로 옮기거나, 인라인 키워드를 유지하거나, cpp 파일에서 제거하십시오. 둘 중 어느 하나가 아니라 (또는 본 것처럼) 둘 다 아닙니다. – WhozCraig

답변

0

정의되지 않은 참조? 그러나 그것은 잘 컴파일됩니다. 물론

String(const char *cc) { 
    string_ = new char[length_ = strlen(cc) + 1]; 
    strcpy(string_, cc); 
} 

int _length; 

같은 데이터 멤버 그리고 다음과 같이 내 테스트 프로그램 추가 : 나는 하나의 생성자를 추가

문자열 AA ("ABC 방송"); String :: iterator itr = aa.begin(); cout < < itr < < endl;

인쇄 "abc" 아무 문제 없음!

+0

내 생성자는 그렇게합니다. 나는'inline' 태그를 제거하고 작동합니다. 이유를 아는 사람. – dabadaba