2012-08-10 6 views

답변

2

std::ostreamstd::ofstream과 같은 특정 스트림 구현의 기본 클래스이므로 직접 인스턴스화 할 수 없습니다.

C에서

++, 자바와는 달리, 우리는 힙에있는 모든 할당하지만 값 의미 선호하지 않습니다

/// Can be easily copied 
class HoldSomething { 
private: 
    std::string name; 
    std::vector<std::string> values; 
public: 
    /// constructors 
    HoldSomething() : name(), values() {} 
    explicit HoldSomething(const std::string& name) : 
     name(name), values() {} 
    /// modifiers 
    void addValue(const std::string& val) { 
     value.push_back(val); 
    } 
... 
+0

정확하게 name(), values ​​() ?? –

+0

이들은 멤버 변수에 대한 생성자 호출입니다. 업데이트 된 코드를 참조하십시오. –

0

참조와 포인터 사이에 혼란스러워합니다. 이 함수는 벡터 & 헤더, 문자열 & host_ 등과 같은 참조를 취합니다. 클래스는 동일한 것은 아닌 포인터를 저장합니다.

정상적으로 함수에 변수를 전달하면 (서명에 no * 또는 &) 변수를 전달하면 전달하는 항목의 복사본을 만들 수 있습니다. 이는 "pass-by-copy"입니다. 포인터 (*)를 전달하면 사용할 변수의 메모리 주소를 가리키는 포인터가 전달됩니다. 엄밀히 말하면 복사로 포인터를 전달하고 있지만 똑같은 점을 지적하면 괜찮습니다. 참조 (&)를 전달하면 함수가 호출되는 범위에서 변수의 별칭을 지정합니다. "변경 사항을 처음에 함수에 전달한 후 바깥 범위에서 변경 사항을 적용하려는 경우를 제외하고는 복사본으로 전달할 때처럼이 변수를 처리하고 싶습니다."라고 말합니다.

그래서, 클래스 대신 일반 회원을 포함 할 수 있습니다

private: 
string host; 
string port; 
string url; 
ostream out; 
vector<string> header; 
unsigned int timeout; 

그런 식으로 당신은 문제없이 함수에 직접 전달할 수 있습니다. 또한이 경우에는 기본값으로 생성되므로 "new"를 사용하거나 다른 작업을 수행 할 필요가 없습니다. 사실, 생성자를 작성할 필요조차 없습니다.

마음을 사로 잡았던 이래로이 모든 것을 수정할 수 있도록 접근 함수가 필요하거나 구조체를 사용하기 전에 데이터 멤버에게 유용한 값을 제공 할 수 있도록 생성자가 매개 변수를 가져야합니다.

PS : 당신은 :) 아래 링크에서 다음 예제를 확인하는 대신 출력을위한 표준 :: ofstream을 사용하려면 : 당신은 당신이 점점 오류를 게시해야

http://www.cplusplus.com/doc/tutorial/files/

0

. std::ostream은 인터페이스입니다. 당신은 그것을 instatiate 수 없습니다.

0

표준 : : ostream에 당신은 "밖으로"초기화 할 수 있습니다 단지 인터페이스 입니다 포인터를 "std :: cout"또는 std :: ostream에서 파생 된 다른 구체적인 객체로 가리 킵니다.예를 들어 : 그런데

out = &std::cout; 

또는

std::ofstream file("file.txt"); 
out = &file; 

, 일반 포인터를 사용하는 것은 좋지 않다. std :: shared_ptr 또는 std :: unique_ptr과 같은 스마트 포인터를 사용해보십시오.