Announcement

Collapse
No announcement yet.

[OOP thắc mắc]viết stack bằng class ứng dụng vào đổi cơ số

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [OOP thắc mắc]viết stack bằng class ứng dụng vào đổi cơ số

    Code:
    class node
    {
    private:
        int number;
        node *next;
    public:
        node(int num=0,node *p=NULL)
        {
            number=num;
            next=p;
        }
        friend class stack;
    };
    class stack
    {
    private:
        node *top;
    public:
        stack(){    node *top=NULL;};
        ~stack(){    node *top=NULL;};
        void push(stack &s,int d)
        {
            node *p=new node(d);
            if(s.top==NULL)
                s.top=p;
                else 
                    {
                        p->next=s.top;
                        top=p;
                    }
        }
        void print(stack s)
        {
            node *p;
            p=new node;
            p=s.top;
            while(p!=NULL)
            {
                [B][COLOR=#FF0000]cout<<p->number;[/COLOR][/B]
                p=p->next;
            }
        }
    };
    int main()
    {
        int x,temp;
        stack s;
        node *p;
        cout<<"\nNhap vao 1 so:";
        cin>>x;
        while(x!=0)
            {
                s.push(s,x%2);
                x/=2;
            }
                
        cout<<"\n So nhi phan:";
        s.print(s);
        getch();
        return 0;
    }
    E đang học OOP mà sao khi viết bài này chạy ra đc kết quả xong báo lỗi ngay dòng p->number(dòng in màu đậm), e ko biết tại sao có lỗi và lỗi gì, mới tìm hiểu OOP mong mọi ng giúp e T.T

  • #2
    Có tí vấn đề với hàm khởi tạo và hàm hủy stack của bạn
    Mã:
    Code:
    stack(){    node *top=NULL;};
    ~stack(){    node *top=NULL;};
    Ở đây bạn đã tạo ra một node* top mới, lưu ý là node* top này hoàn toàn khác với cái node* top trong thành phần private của bạn
    Do đó,khi bạn gán cho top = null như trên thì giá trị của top(trong private) hoàn toàn không được gán
    Vì vậy khi stack được tạo ra sẽ gọi constructor không có đối số của bạn và thành phần top vẫn chưa được cấp phát do đó gây ra lỗi
    Để fix thì bạn đơn giản chỉ việc đổi cái constructor(và tiện tay đổi luôn cái destructor)
    Code:
    stack(){ top=NULL;}
    ~stack(){ top=NULL;}
    P.S: Bạn nên khai báo node* top thay vì node *top để tránh hiểu lầm, node*, int*,[cái gì đó]* cũng chỉ là một kiểu dữ liệu thôi!

    Comment


    • #3
      e hiểu lỗi mình rồi mà a ơi cái node* top và node *p khác nhau à @@, e nghĩ node *p là khai báo 1 con pointer trỏ đến kiểu dl là node @@, còn node* p là sao a ?

      Comment


      • #4
        Về con trỏ thì tốt nhất em nên đọc bài viết này của anh Langman để hiểu rõ bản chất của con trỏ.
        node* hay node * cũng có đề cập đó.
        Mình trích dẫn lại:
        int* a,b; //thì a là con trỏ, b là biến nguyên
        //và cách viết như này cực kì đáng ghét vì gây ra toàn hiểu lần đáng ghét
        Last edited by 08520134; 01-04-2012, 01:52.

        Comment


        • #5
          À, thật ra không có gì khác nhau đâu bạn, nhưng vì thường với khai báo kiểu node *p thì bạn cứ nghĩ *p là biến còn kiểu dữ liệu là node nhưng thật ra ở đây biến là p và kiểu dữ liệu là node*. Còn như Hoàng trích dẫn chỗ int* a,b; -> gây hiểu lầm thì cũng đúng luôn nhưng mình toàn khai báo kiểu int* a; int* b;. Còn nếu bạn đã hiểu bản chất vấn đề ở đây rồi thì khai báo kiểu gì cũng được cả, không có lỗi gì đâu. Bạn coi link của anh Hoàng đưa ra để biết thêm nha!

          Comment


          • #6
            bài đó của a langman bên congdongcviet e có từng đọc wa a à ^^, vậy hóa ra ghi node* a,b thế này hay gây hiểu nhầm cho nhìu người rằng a,b cùng là con trỏ à ^^

            Comment

            LHQC

            Collapse
            Working...
            X