2017-04-10 2 views
-1

내 작업은 스택에 >> 및 < < 연산자를 오버로드하는 것입니다. 그들은 팝과 푸시처럼 작동해야합니다. 그것은 그오버로드 >> 연산자

stack << 4.0 << 5.0; // here I pushed two elements 
float x, y, z; 
stack >> x >> y >> z; //here pop 3 elements to x,y,z 

과 같아야 그래서 나는 스택의 배열 구현을 사용 들었다과 < < 작품에 대한 그냥 푸시를 회상 할 때.

float pop(){ 
    if(!empty()){ 
    n--; 
    return data[n+1];} 
    } 

void push (float x){ 
    if (n<MAX){ 
    data[n++]=x;  
    }else { 
    cout<<"Overload!";} 
    } 

Stack operator<<(float k){ 
    push(k); 
    } 

friend istream & operator>>(istream &in, Stack &ob);  

클래스 외부에서 >>를 정의하려고했지만 작동하지 않습니다.

istream & operator>>(istream &in, Stack &ob){ 
} 
    in>>ob.pop(); 
    return in; 
} 

실마리를 줄 수 있습니까?

+1

'>>'연산자는'<< "연산자와 거의 동일한 프로토 타입을 가져야합니다. ('stack >> x;'istream을 어디에서 찾았습니까?) – molbdnilo

+0

'operator >>()'가'stack >> some_value'와 같은 표현식을 사용하여 요소를 pop하고 싶다고합니다. 여러분이 정의한 유일한 연산자''>> (>>)는 입력 스트림에서 표면적으로 스택을 읽는 연산자입니다. 너는 어느 쪽을 원합니까? – Peter

+0

이것은 연산자 오버로딩을 사용하는 끔찍한 방법입니다. 이것도 원래의 의미를 끊어 버리기 때문에 코드를 읽을 수 없게 만들지 만 스트리밍을 할 때 스택을 효과적으로 파괴합니다 (pops 요소). 이 부작용은 위험하고 당신이 정말로하고 싶지 않은 것을 필요로합니다. – Ondrej

답변

2

이와 비슷한?

#include <iostream> 

struct Stack { 
    static const int capacity = 10000; 

    void push(float x) { data[sp++] = x; } 

    float pop() { return data[--sp]; } 

    float data[capacity]; 
    int sp = 0; 
}; 

Stack &operator<<(Stack &s, float x) { 
    s.push(x); 
    return s; 
} 

Stack &operator>>(Stack &s, float &x) { 
    x = s.pop(); 
    return s; 
} 

int main() { 
    Stack stack; 
    stack << 4.0 << 5.0 << 6.0; 
    float x, y, z; 
    stack >> x >> y >> z; //here pop 3 elements to x,y,z 

    std::cout << x << " " << y << " " << z << std::endl; 
} 
관련 문제