2016-10-24 4 views
0

제목으로, ostream 참조를 취하여 인쇄하는 기능을 만들려고합니다. 컨텍스트는 이진 검색 트리의 컨텍스트입니다.ostream 참조를 가져 와서 인쇄하는 함수를 만드는 올바른 방법은 무엇입니까?

내가 너무 ostream에 경험하고 있지 않다

, 나는 단지 내가 구글에서 발견 연산자 오버로딩 < <위한 기본 템플릿 예제를 기반으로 (만 학습 C++ 약 3 주 전에 시작)를 한 번 전에 사용했습니다.

내 제한된 이해와 함께 나는 내가 만든 함수로 이것을 어떻게 구현할 지 확신하지 못한다.

이것은 내가 지금까지 시도 내 제한된 지식을 바탕으로 한 것입니다, 내가 먼저 내가 기능을 만들려고 그런 기준 void write(std::ostream &out) const;

을 만들어

,

std::ostream& write(std::ostream &out,node& o){ 

     out << o.leftChild<< " " << o.val << " " << o.rightChild; 
     return out; 
    } 

ieoleftChild o.rightChild는 노드의 결과를 인쇄해야합니다. o.val은 노드의 데이터입니다. 내가 위에서처럼 참조를 사용하려고하면

예상되는 결과는, 그러나 1 2 3 4과 같이해야한다, 나는 쓰기 구현되지 않았 음을 말하는 내 IDE가 오류 메시지를 제공하고 있습니다.

그러나 참조를 메소드로 작성한 경우 결과는 공백으로 반환됩니다.

업데이트 : 참조를 제거하고 더 이상 오류 메시지가 표시되지 않습니다.

그러나 결과는 여전히 제로입니다. 이는 잘못된 구현으로 인한 것입니다.

UPDATE2 : 내가 정확하게 시도하려고하는 것은, 그것에 쓰기 기능 인쇄를하는 것입니다,

노드에서, 다음에 공백, 왼쪽 아이에 데이터를 쓰기 호출의 결과 , 공간 및 오른쪽 자식에 대한 쓰기 결과 (있는 경우)가 포함됩니다.

이 세그먼트의 모든 이전 코드는 의도 한대로 작동합니다. 변수의 경우 data이 템플릿 인수 유형 (T)이고 왼쪽 자식 및 오른쪽 자식unique_ptr<node>입니다.

+0

경기 수 용이성 제공 [mcve] – Barry

+4

문제점은 ostream, 참조 또는 2 진 검색 트리 또는 노드와 관련이 없습니다. 이 함수를 정의하고 호출하는 방법에 관한 것입니다. 우리는이 함수 중 하나의 일부만 볼 수 있습니다. –

+0

그래서 함수를 정의하고 호출하는 올바른 방법은 무엇입니까? – LovesPie

답변

0

첫 번째 사항 : void write(std::ostream &out) const;은 참조가 아닙니다. 그것은 함수의 선언입니다.

두 번째 : 선언 마지막에 const에서 판단하여 클래스 내부의 메소드입니다. 그런 다음 클래스 본체 외부의 메서드를 정의하는 동안 범위 연산자 (::)를 사용해야합니다.

"공백 결과"는 더 이상의 코드가 없으면 아무 것도 말할 수 없습니다.

0

첫 번째 write() 선언은 클래스 (아마도 node 클래스)의 메소드를 선언하지만, 당신은 몸이 방법의을 구현하지 않습니다. 그것이 컴파일러가 불평하는 것입니다.

두 번째 write()은 클래스 메소드가 아닌 독립 실행 형 함수의 본문을 구현하고 있습니다.

class node { 
    ... 
public: 
    ... 
    void write(std::ostream &out) const; 
}; 

void node::write(std::ostream &out) const { 
    if (leftChild) { 
     leftChild->write(out); 
     out << " "; 
    } 
    out << val; 
    if (rightChild) { 
     out << " "; 
     rightChild->write(out); 
    } 
} 

는 다음과 같이 사용할 수 있습니다 :

node n; 
... 
n.write(std::cout); 

unique_ptr<node> n(...); 
... 
n->write(std::cout); 

대신 이와 비슷한 더 많은 것을보십시오

독립형 기능을 구현하려면,이 같은 더 보일 것입니다 :

node n; 
... 
write(std::cout, n); 

: 다음과 같이 사용할 수 있습니다

class node { 
    ... 
public: 
    ... 
    void write(std::ostream &out) const; 
}; 

std::ostream& write(std::ostream &out, const node &n); 

void node::write(std::ostream &out) const { 
    ... 
} 

std::ostream& write(std::ostream &out, const node &n) { 
    n.write(out); 
    return out; 
} 

unique_ptr<node> n(...); 
... 
write(std::cout, *n); 

그리고 당신은 대신 사용자 지정 operator<<에 독립 기능을 변경하여 한 단계 더 걸릴 수 :

class node { 
    ... 
public: 
    ... 
    void write(std::ostream &out) const; 
}; 

std::ostream& operator<<(std::ostream &out, const node &n); 

void node::write(std::ostream &out) const { 
    if (leftChild) 
     out << *leftChild << " "; 
    out << val; 
    if (rightChild) 
     out << " " << *rightChild; 
} 

std::ostream& operator<<(std::ostream &out, const node &n) { 
    n.write(out); 
    return out; 
} 

node n; 
... 
std::cout << n; 

unique_ptr<node> n(...); 
... 
std::cout << *n; 
+0

여러 가지 방법을 시도했지만 컴파일러가 범위에서 선언되지 않은 변수에 대해 불평하고 있습니다. – LovesPie

+0

@KyleA 그런 다음 실제 코드와 실제 컴파일러 오류를 보여주는 [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)를 제공해주십시오. 당신은 명확하게 뭔가 잘못하고 있지만, 우리는 당신이하는 모든 것을 볼 수 없습니다. –

관련 문제