Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 20
  1. #1
    Tham gia
    28-05-2007
    Location
    Biên Hoà
    Bài viết
    102
    Like
    0
    Thanked 0 Times in 0 Posts

    2 class lồng nhau, chương trình báo lỗi, giúp mình với nha!

    Khi mình làm bài như sau:

    #include "iostream.h"

    class CDiem
    {
    private :
    float x;
    float y;
    public :
    CDiem();
    virtual ~CDiem();
    // friend CTamGiac;
    friend istream & operator >> (istream &is, CDiem &P);
    friend ostream & operator << (ostream &os, CDiem &P);
    };

    class CTamGiac
    {
    private :
    CDiem A;
    CDiem B;
    CDiem C;
    public:
    CTamGiac();
    virtual ~CTamGiac();
    friend CDiem;
    friend istream & operator >> (istream &is, CTamGiac &S);
    friend ostream & operator << (ostream &os, CTamGiac &S);
    CDiem TrongTam ();
    };

    void main()
    {
    CTamGiac S;
    CDiem G;
    cout << "Nhap tam giac S" << endl;
    cin >> S;
    cout << "Trong tam tam giac S la" << endl;
    G = S.TrongTam();
    cout << G;
    }

    CDiem::CDiem()
    {
    x = 0;
    y = 0;
    }

    CDiem::~CDiem()
    {
    return;
    }

    istream & operator >> (istream &is, CDiem &P)
    {
    cout << " Nhap hoanh do";
    is >> P.x;
    cout << " Nhap tung do";
    is >> P.y;
    return is;
    }

    ostream & operator << (ostream &os, CDiem &P)
    {
    os << " (" << P.x << ";" << P.y << ")";
    return os;
    }

    CTamGiac::CTamGiac()
    {

    }

    CTamGiac::~CTamGiac()
    {
    return;
    }

    istream & operator >> (istream &is, CTamGiac &S)
    {
    cout << "Nhap diem A:";
    is >> S.A;
    cout << "Nhap diem B:";
    is >> S.B;
    cout << "Nhap diem C:";
    is >> S.C;
    return is;
    }

    ostream & operator << (ostream &os, CTamGiac &S)
    {
    os << "[" << S.A << ", " << S.B << ", " << S.C << "]";
    return os;
    }

    CDiem CTamGiac::TrongTam ()
    {
    CDiem temp;
    temp.x = (A.x + B.x + C.x) / 3;
    temp.y = (A.y + B.y + C.y) / 3;
    return temp;
    }

    khi biên dịch chương trình xuất hiện 8 lỗi như sau:
    C:\Documents and Settings\Dao Son Hai\main.cpp(98) : error C2248: 'x' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(6) : see declaration of 'x'
    C:\Documents and Settings\Dao Son Hai\main.cpp(98) : error C2248: 'x' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(6) : see declaration of 'x'
    C:\Documents and Settings\Dao Son Hai\main.cpp(98) : error C2248: 'x' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(6) : see declaration of 'x'
    C:\Documents and Settings\Dao Son Hai\main.cpp(98) : error C2248: 'x' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(6) : see declaration of 'x'
    C:\Documents and Settings\Dao Son Hai\main.cpp(99) : error C2248: 'y' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(7) : see declaration of 'y'
    C:\Documents and Settings\Dao Son Hai\main.cpp(99) : error C2248: 'y' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(7) : see declaration of 'y'
    C:\Documents and Settings\Dao Son Hai\main.cpp(99) : error C2248: 'y' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(7) : see declaration of 'y'
    C:\Documents and Settings\Dao Son Hai\main.cpp(99) : error C2248: 'y' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(7) : see declaration of 'y'
    Error executing cl.exe.

    main.exe - 8 error(s), 0 warning(s)
    Mọi người sửa giúp mình với, ko biết sửa ra sao hết!
    Quote Quote

  2. #2
    Tham gia
    31-08-2002
    Location
    Trái đất
    Bài viết
    1,910
    Like
    11
    Thanked 60 Times in 50 Posts
    x và y trong class CDiem là private mà ở bên CTamgiac truy cập vào vô tư nhỉ :|
    Đưa float x; float y; từ trên private xuống public là hết ngay.

  3. #3
    Tham gia
    28-05-2007
    Location
    Biên Hoà
    Bài viết
    102
    Like
    0
    Thanked 0 Times in 0 Posts
    Woa! Đại ca này giỏi quá! Sửa xong rồi! Bác giải thích giùm em vì sao lại phải làm như vậy được ko?

  4. #4
    Tham gia
    05-05-2010
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi daoson_hai View Post
    Khi mình làm bài như sau:

    #include "iostream.h"

    class CDiem
    {
    private :
    float x;
    float y;
    public :
    CDiem();
    virtual ~CDiem();
    // friend CTamGiac;
    friend istream & operator >> (istream &is, CDiem &P);
    friend ostream & operator << (ostream &os, CDiem &P);
    };

    class CTamGiac
    {
    private :
    CDiem A;
    CDiem B;
    CDiem C;
    public:
    CTamGiac();
    virtual ~CTamGiac();
    friend CDiem;
    friend istream & operator >> (istream &is, CTamGiac &S);
    friend ostream & operator << (ostream &os, CTamGiac &S);
    CDiem TrongTam ();
    };

    void main()
    {
    CTamGiac S;
    CDiem G;
    cout << "Nhap tam giac S" << endl;
    cin >> S;
    cout << "Trong tam tam giac S la" << endl;
    G = S.TrongTam();
    cout << G;
    }

    CDiem::CDiem()
    {
    x = 0;
    y = 0;
    }

    CDiem::~CDiem()
    {
    return;
    }

    istream & operator >> (istream &is, CDiem &P)
    {
    cout << " Nhap hoanh do";
    is >> P.x;
    cout << " Nhap tung do";
    is >> P.y;
    return is;
    }

    ostream & operator << (ostream &os, CDiem &P)
    {
    os << " (" << P.x << ";" << P.y << ")";
    return os;
    }

    CTamGiac::CTamGiac()
    {

    }

    CTamGiac::~CTamGiac()
    {
    return;
    }

    istream & operator >> (istream &is, CTamGiac &S)
    {
    cout << "Nhap diem A:";
    is >> S.A;
    cout << "Nhap diem B:";
    is >> S.B;
    cout << "Nhap diem C:";
    is >> S.C;
    return is;
    }

    ostream & operator << (ostream &os, CTamGiac &S)
    {
    os << "[" << S.A << ", " << S.B << ", " << S.C << "]";
    return os;
    }

    CDiem CTamGiac::TrongTam ()
    {
    CDiem temp;
    temp.x = (A.x + B.x + C.x) / 3;
    temp.y = (A.y + B.y + C.y) / 3;
    return temp;
    }

    khi biên dịch chương trình xuất hiện 8 lỗi như sau:
    C:\Documents and Settings\Dao Son Hai\main.cpp(98) : error C2248: 'x' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(6) : see declaration of 'x'
    C:\Documents and Settings\Dao Son Hai\main.cpp(98) : error C2248: 'x' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(6) : see declaration of 'x'
    C:\Documents and Settings\Dao Son Hai\main.cpp(98) : error C2248: 'x' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(6) : see declaration of 'x'
    C:\Documents and Settings\Dao Son Hai\main.cpp(98) : error C2248: 'x' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(6) : see declaration of 'x'
    C:\Documents and Settings\Dao Son Hai\main.cpp(99) : error C2248: 'y' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(7) : see declaration of 'y'
    C:\Documents and Settings\Dao Son Hai\main.cpp(99) : error C2248: 'y' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(7) : see declaration of 'y'
    C:\Documents and Settings\Dao Son Hai\main.cpp(99) : error C2248: 'y' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(7) : see declaration of 'y'
    C:\Documents and Settings\Dao Son Hai\main.cpp(99) : error C2248: 'y' : cannot access private member declared in class 'CDiem'
    C:\Documents and Settings\Dao Son Hai\main.cpp(7) : see declaration of 'y'
    Error executing cl.exe.

    main.exe - 8 error(s), 0 warning(s)
    Mọi người sửa giúp mình với, ko biết sửa ra sao hết!
    Bạn không nên đưa thuộc tính của private xuống public được đâu, đó là sai nguyên tắc. Bạn nên viết một hàm get_x() và get_y() để lấy thuộc tính của lớp CDiem rồi trong lớp CTamGiac bạn mới gọi hàm thực hiên được cụ thể như sao:
    class CDiem
    {
    private:
    ...
    public:
    float get_x()
    {
    return x;
    }
    float get_y()
    {
    return y;
    }
    ...
    };
    class CTamGiac
    {
    ...
    };
    ...
    CDiem CTamGiac::TrongTam ()
    {
    CDiem temp;
    temp.get_x() = (A.get_x() + B.get_x() + C.get_x()) / 3;
    temp.get_y() = (A.get_y() + B.get_y() + C.get_y()) / 3;
    return temp;
    }
    Sao code này giống của DH Khoa Học Tự Nhiên quá ta.)
    Được sửa bởi ck_041176 lúc 07:35 ngày 06-05-2010

  5. #5
    Tham gia
    19-04-2010
    Bài viết
    156
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi daoson_hai View Post
    Woa! Đại ca này giỏi quá! Sửa xong rồi! Bác giải thích giùm em vì sao lại phải làm như vậy được ko?
    Mình đưa code để tham khảo nhé:
    PHP Code:
    #include <iostream.h>

    class CDiem 
    {
        
    float xy;
        public :
            
    CDiem(float _x=0float _y=0){_x;_y;}
            
    CDiem operator + (CDiem b) {return CDiem(b.xb.y);}
            
    CDiem operator / (float f) {return CDiem(x/fy/f);}

            
    friend istream operator >> (istream &isCDiem &);
            
    friend ostream operator << (ostream &osCDiem);
    };

    class 
    CTamGiac : public CDiem
    {
        
    CDiem d***91;3***93;;
        public:
            
    CTamGiac(CDiem _A CDiem(0,0),CDiem _B CDiem(0,0),CDiem _C CDiem(0,0))
                { 
    d***91;0***93; = _Ad***91;1***93; = _Bd***91;2***93; = _C;}

            
    CDiem &operator ***91;***93;(int k) {return d***91;k***93;;}

            
    friend istream operator >> (istream &isCTamGiac &);
            
    friend ostream operator << (ostream &osCTamGiac);
            
    CDiem TrongTam ();
    };

    void main()
    {
        
    CTamGiac S;
        
    cout << "Nhap tam giac S"<<endlcin >> S;
        
    cout << "Trong tam tam giac S la " << S.TrongTam() << endl;
    }


    istream operator >> (istream &isCDiem &P)
    {
        
    cout << " Nhap hoanh do: "is >> P.x;
        
    cout << " Nhap tung do: "is >> P.y;
        return 
    is;
    }

    ostream operator << (ostream &osCDiem P)
    {
        
    os << " (" << P.<< ";" << P.<< ")";
        return 
    os;
    }

    istream operator >> (istream &isCTamGiac &S)
    {
        
    cout << "Nhap diem A:" << endlis >> S***91;0***93;;
        
    cout << "Nhap diem B:" << endlis >> S***91;1***93;;
        
    cout << "Nhap diem C:" << endlis >> S***91;2***93;;
        return 
    is;
    }

    ostream operator << (ostream &osCTamGiac S)
    {
        
    os << "***91;" << S***91;0***93; << ", " << S***91;1***93; << ", " << S***91;2***93; << "***93;";
        return 
    os;
    }

    CDiem CTamGiac::TrongTam ()
    {
        return (
    d***91;0***93; + d***91;1***93; + d***91;2***93;)/3;


  6. #6
    Tham gia
    05-05-2010
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi onminh View Post
    Mình đưa code để tham khảo nhé:
    PHP Code:
    #include <iostream.h>

    class CDiem 
    {
        
    float xy;
        public :
            
    CDiem(float _x=0float _y=0){_x;_y;}
            
    CDiem operator + (CDiem b) {return CDiem(b.xb.y);}
            
    CDiem operator / (float f) {return CDiem(x/fy/f);}

            
    friend istream operator >> (istream &isCDiem &);
            
    friend ostream operator << (ostream &osCDiem);
    };

    class 
    CTamGiac : public CDiem
    {
        
    CDiem d***91;3***93;;
        public:
            
    CTamGiac(CDiem _A CDiem(0,0),CDiem _B CDiem(0,0),CDiem _C CDiem(0,0))
                { 
    d***91;0***93; = _Ad***91;1***93; = _Bd***91;2***93; = _C;}

            
    CDiem &operator ***91;***93;(int k) {return d***91;k***93;;}

            
    friend istream operator >> (istream &isCTamGiac &);
            
    friend ostream operator << (ostream &osCTamGiac);
            
    CDiem TrongTam ();
    };

    void main()
    {
        
    CTamGiac S;
        
    cout << "Nhap tam giac S"<<endlcin >> S;
        
    cout << "Trong tam tam giac S la " << S.TrongTam() << endl;
    }


    istream operator >> (istream &isCDiem &P)
    {
        
    cout << " Nhap hoanh do: "is >> P.x;
        
    cout << " Nhap tung do: "is >> P.y;
        return 
    is;
    }

    ostream operator << (ostream &osCDiem P)
    {
        
    os << " (" << P.<< ";" << P.<< ")";
        return 
    os;
    }

    istream operator >> (istream &isCTamGiac &S)
    {
        
    cout << "Nhap diem A:" << endlis >> S***91;0***93;;
        
    cout << "Nhap diem B:" << endlis >> S***91;1***93;;
        
    cout << "Nhap diem C:" << endlis >> S***91;2***93;;
        return 
    is;
    }

    ostream operator << (ostream &osCTamGiac S)
    {
        
    os << "***91;" << S***91;0***93; << ", " << S***91;1***93; << ", " << S***91;2***93; << "***93;";
        return 
    os;
    }

    CDiem CTamGiac::TrongTam ()
    {
        return (
    d***91;0***93; + d***91;1***93; + d***91;2***93;)/3;

    Thuộc tính x,y của lớp CDiem phải nằm trong private mới đúng nguyên tắc bạn ơi

  7. #7
    Tham gia
    29-04-2009
    Bài viết
    17
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi ck_041176 View Post
    Thuộc tính x,y của lớp CDiem phải nằm trong private mới đúng nguyên tắc bạn ơi
    Haizzzzzz.Code mà bác onminh viết thì x,y class CDiem là private rồi đó.Bạn chưa đọc kĩ C++(oop) mà đã .....kêu bác ấy viêt sai.
    -Mà chẳng có j là nguyên tắc ở đây cả.Tôi thích nó là public thì có sao? Chủ yếu là do ý người viết code thôi.Chứ public hay private j mà chẳng đc.Mà có private đi chăng nữa thì tôi vẫn truy cập để get/set giá trị của các thuộc tính private bình thường

  8. #8
    Tham gia
    19-04-2010
    Bài viết
    156
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi ck_041176 View Post
    Thuộc tính x,y của lớp CDiem phải nằm trong private mới đúng nguyên tắc bạn ơi
    Cậu này xem ra chưa thuộc bài, vậy sao mà code được. Hãy lắng nghe đóng góp của TAUIT_DNMD.

  9. #9
    Tham gia
    05-05-2010
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi TAUIT_DNMD View Post
    Haizzzzzz.Code mà bác onminh viết thì x,y class CDiem là private rồi đó.Bạn chưa đọc kĩ C++(oop) mà đã .....kêu bác ấy viêt sai.
    -Mà chẳng có j là nguyên tắc ở đây cả.Tôi thích nó là public thì có sao? Chủ yếu là do ý người viết code thôi.Chứ public hay private j mà chẳng đc.Mà có private đi chăng nữa thì tôi vẫn truy cập để get/set giá trị của các thuộc tính private bình thường
    Đồng ý là mình chưa đọc kĩ thật nhưng đó chỉ là không biết thôi( ai mà biết tất cả đâu nào?)vì mình chỉ mới tiếp xúc với oop. Nhưng nếu anh nói không có nguyên tắc ở đây là cũng không đúng cho lắm. Là một sinh viên năm nhất học KHTN, thầy mình dạy là nếu ai đặt thuộc tính của private nằm trong public thì thầy sẽ cho 0 điểm ngay lập tức( Thsi Nguyễn Tấn Trần Minh Khang anh có thể lên google seach). Nếu anh nói đặt thuộc tính trong public hay private là j mà chẳng được, đồng ý. Nhưng nếu vậy thì C++ lập ra public và private để làm gì????. Còn anh nói vẫn có thể truy cập để get/set giá trị của các thuộc tính private bình thường là đúng(cái này em có sửa bài giùm bạn đã nêu ra vần đề ở trên rồi), nhưng đúng là đúng với người viết ra code đó, nếu như người đó viết ra một tập hợp lệnh không cho bất kì ai có thể get/set gí tri các thuộc tính của private rồi sao?
    Nếu có gì sai sót mong anh chỉ bảo
    Được sửa bởi ck_041176 lúc 02:59 ngày 08-05-2010 Reason: Bổ sung bài viết

  10. #10
    Tham gia
    29-04-2009
    Bài viết
    17
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi ck_041176 View Post
    Đồng ý là mình chưa đọc kĩ thật nhưng đó chỉ là không biết thôi( ai mà biết tất cả đâu nào?)vì mình chỉ mới tiếp xúc với oop. Nhưng nếu anh nói không có nguyên tắc ở đây là cũng không đúng cho lắm. Là một sinh viên năm nhất học KHTN, thầy mình dạy là nếu ai đặt thuộc tính của private nằm trong public thì thầy sẽ cho 0 điểm ngay lập tức( Thsi Nguyễn Tấn Trần Minh Khang anh có thể lên google seach). Nếu anh nói đặt thuộc tính trong public hay private là j mà chẳng được, đồng ý. Nhưng nếu vậy thì C++ lập ra public và private để làm gì????. Còn anh nói vẫn có thể truy cập để get/set giá trị của các thuộc tính private bình thường là đúng(cái này em có sửa bài giùm bạn đã nêu ra vần đề ở trên rồi), nhưng đúng là đúng với người viết ra code đó, nếu như người đó viết ra một tập hợp lệnh không cho bất kì ai có thể get/set gí tri các thuộc tính của private rồi sao?
    Nếu có gì sai sót mong anh chỉ bảo
    Nguyên tắc :không có nguyên tắc nào bắt các thuộc tính là private cả.Tùy vào mục đích người code cần thôi.
    -->Bạn hiểu ý tôi: truy cập để get set thông tin private bình thường của tôi là như thế nảo nhỉ?.Nghĩa là không dùng bất cứ 1 hàm nào thuộc class đó
    Cái tôi nói chính là áp dụng khi:" nếu như người đó viết ra một tập hợp lệnh không cho bất kì ai có thể get/set gí tri các thuộc tính của private rồi sao?"

    VD:Có class sau:
    PHP Code:
    class Crime
    {
        private:
        
    string nickname;
        
    int age;
        
    float balance;
        public:
        
    Crime(string name,int age,float bal)
        {
            
    nickname=name;
            
    this->age=age;
            
    balance=bal;
        }
    }; 
    -->cái tôi nói là có thể get/set thông tin cho các thuộc tính private mà không thay đổi bất cứ thứ j trong class đã cho(không viết thêm hàm hay chỉnh sửa thứ j)
    P/S:
    bạn có biết số năm trong ngành code của bác onminh là bao nhiêu ko?lớn hơn số tuổi của bạn đó.kinh nghiệm thì bác ấy có thừa
    Thầy bạn chỉ bắt học sinh làm thế thôi.Chư không 1 tài liệu nào nói thế
    (TUI năm 2)

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •