두 변수 artist
및,은 포인터이며 개체가 아닙니다. 다음과 같은했다면 따라서, 같은 동작을 표시되지 않는 :
String artist;
input_file >> artist;
당신이 operator>>()
의 적절한 과부하가 있었다 물론 가정을 (나는 약간의 것을 설명 할 것이다).
포인터를 읽으려고하면 컴파일러에서 오른쪽 인수에 String
에 대한 포인터를 취한 스트림 추출 연산자 (operator>>()
)의 오버로드를 찾을 수 없기 때문에 오류가 발생합니다. 컴파일러가 artist
또는 title
을 오른쪽 인수로 변환하려고 할 때 발생하는 모든 후보 오버로드 및 해당 오류를 나열했기 때문에 하단에 "cannot convert 'title' to type 'signed char*'
이 표시되는 이유가있었습니다.
포인터를 사용해야하는 경우 유효한 개체로 초기화해야합니다. 스트림이 그것으로 데이터를 읽을 수 있도록 그리고 당신은 포인터 역 참조가 가리키는 객체에 대한 참조를 얻을 수 있어야합니다 다음
String* artist = new String;
input_file >> *artist;
그러나 다시, 당신은 실제로 포인터 여기 필요합니까. 이것은 스택에 객체를 유지하여 수행 할 수 있습니다 :
String artist;
input_file >> artist;
new
로 생성 된 데이터에 할당 된 경우 여전히 포인터를 사용할 필요가 어떤 이유로, 당신은 메모리를 포인터 포인트 (할당을 해제 기억해야하는 경우). 당신은이 delete
을 사용하여 수행
// when you are finished using the data artist or title points to
delete artist;
delete title;
또는 당신이 std::unique_ptr<String>
를 사용할 수 있습니다. std::unique_ptr<>
는 범위를 벗어나면 당신을위한 메모리를 관리하는 컨테이너입니다, 그래서 당신은 자원 자신의 할당을 해제하는 것이 필요하다 : 컴파일러는 새로운 인 std::unique_ptr<>
를 지원하지 않는 경우
{
std::unique_ptr<String> title;
// ...
} // <= the resource held by title is released
을 (C++ 11) 객체의 경우 std::shared_ptr<>
을 사용할 수 있습니다.
사용자 정의 클래스에 스트림 I/O 의미를 포함 할 때, 당신이 이후에 클래스의 데이터 멤버로 데이터를 추출 스트림 연산자의 오버로드를 제공하는 것이 일반적입니다.
당신이 우리를 표시 한 것으로 판단 X x;
istream_object >> x;
ostream_object << x;
, 당신이 입력 스트림 개체에 대한 과부하를 제공했다고 생각하지 않습니다 그것은 구문을 할 수 있습니다. 여기에 하나가 당신의 String
클래스 같을 것이다 무엇 :
std::istream& operator>>(std::istream& is, String& s)
{
// code for extraction goes here
}
당신이 추출기에 대한 액세스를 필요로 개인 회원이있는 경우, 당신은 클래스의 친구로 그것을 선언 할 수 있습니다.
왜 이렇게 많은 불필요한 포인터가 ... – yizzlez
@awesomeyi 이것은 C++ 클래스에 대한 나의 소개를위한 것이며, 목적은 불편한 양의 포인터를 사용하여 편안하게 해주는 것입니다. haha – user3558697
'const char * text;' 그러한'String' 구조체에는별로 유용하지 않습니다. -/... –