Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: [ Solved ]Xem dùm về đoạn code Đa hình

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    0

    Question [ Solved ]Xem dùm về đoạn code Đa hình

    C++ Code:
    1. class point;// da dinh nghia truoc do
    2. class shapes{
    3. protected:
    4.     point *ps;
    5. public:
    6.     shapes(){ps=NULL;}
    7.     ~shapes(){ if(ps!=NULL) delete []ps;}
    8.     virtual void display()=0;
    9.     virtual void run(int speed,Directed direction)=0;
    10.     virtual void zoomin(int radian)=0;
    11.     virtual void zoomout(int radian)=0;
    12. };
    13. class shapescolor:public shapes{
    14. protected:
    15.     int color;
    16. public:
    17.     shapescolor(int col=0):shapes(){color=col;}
    18.     friend ostream& operator <<(ostream& out,shapescolor *shp);
    19. };
    20. ostream& operator <<(ostream &out,shapescolor *shp){// Dung tinh da hinh
    21.     shp->display();
    22.     return out;
    23. }
    24. class rectangles:public shapescolor{
    25.     public:
    26.     rectangles(point &a,point &b,int col=0):shapescolor(col){
    27.         ps=new point[2];
    28.         ps[0]=a;ps[1]=b;
    29.     }
    30.     ~rectangles(){ if(ps!=NULL) delete []ps; }
    31.     virtual void display(){
    32.         /*setcolor(color);
    33.         rectangle(ps[0]._x(),ps[0]._y(),ps[1]._x(),ps[1]._y());
    34.         floodfill((ps[0]._x() + 1),(ps[0]._y() + 1),color);*/
    35.                           cout<<"goi ham display cua Rectangles";
    36.     }
    37.     void run(int speed,Directed direction){}//Se dinh nghia sau
    38.     void zoomin(int radian){}
    39.     void zoomout(int radian){} 
    40. };
    41. void main(){
    42.              shapes *list;
    43.     list=new rectangles (point(50,50),point(100,100),15);
    44.     cout<<list;
    45. }
    Mình dùng tính đa hình ( thông qua con trỏ lớp Shapes , định nghĩa >> trong ostream ) để gọi phương thức display trong lóp rectangles. Mà không hiểu sao không in ra nội dung trong phương thức ảo của lớp rectangles ma in ra dia chỉ 1 ô nhớ :0x3a36 ( mình nghĩ la vậy ) ?
    Không biết mình có làm sai j không nhỉ ?? Mong các ban chỉ giúp ??
    Thứ hai em phải đi học
    Thứ ba em cũng vì học phải đi
    Thứ tư đi học nên đi
    Thứ năm càng phải vội đi để học
    Thứ sáu em cũng phải siêng
    Thứ bảy bận quá vì học phải đi
    Chủ nhật thủng thẳng nghĩ suy
    Ở nhà buồn quá có khi đi học

    Học hoài , học nữa , học tiếp có khi hộc máu
    Học cho lắm tắm hổng có quần thay
    Học cho hay cũng thay hoài cái quần cũ

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Code cậu quá nhiều lỗi :
    - Cậu coi cho kĩ có rất nhiều hàm nó *nên* là const, sử dụng từ khoá const as many as possible.
    - Cậu đọc lại về v-table, cậu xem các hàm ảo của cậu xem nó có khác nhau gì không ? Hàm ảo là gì ? Nó tương tự như nó có cái vẻ giống nhau nhưng nội dung bên trong khác nhau, muốn thể hiện tính ảo thì nó bắt buộc phải có cái vỏ giống nhau ( tên hàm, tham số truyền vào ). Vì sao ? Vì cơ bản là abstract chỉ dựa vào v-tables mà gọi hàm, nếu nó khác thì nó sẽ không có trong v-table.
    - Không dùng friend làm gì, không cần thiết, dùng thẳng ostream luôn, nên pass 1 stream output ( std::ostream& os ) vào các hàm output vì khi xài cout, nó có những tình huống sẽ bị hư stream ( chẳng hạn đi cùng vói setfile, setw(), ...etc ).
    - Cách đặt tên của cậu cũng có vấn đề, class Type thì nên đặt nó Hoa lên, cách viết này tuy chỉ là vấn đề về style nhưng tui nhận thấy style này là rất nghèo nàn nên tránh.
    - Tập dùng const ref cho những đối tượng mà ta không muốn đụng chạm đến nó as much as possible.
    - Không có void main() trong C/C++ , mặc dù có 1 số compiler chấp nhận nó nhưng ISO C/C++ đã bỏ nó lâu lắm rùi, xài int main(), return 0.
    - Cậu khởi tạo con trỏ trong main(), delete của cậu đâu ?
    Đây là 1 ví dụ tui demo lại, cậu coi đó mà viết các method còn lại.

    C++ Code:
    1. #include <iostream>
    2.  
    3. struct Point
    4. {
    5.     int dx, dy;
    6.     Point( int dx, int dy )
    7.         :dx( dx ), dy( dy )
    8.     {   }
    9.     Point( )
    10.         :dx( 0 ), dy( 0 )
    11.     {   }
    12. };
    13.  
    14. class Shape
    15. {
    16. protected:
    17.     Point* ps;
    18. public:
    19.     Shape()
    20.     {
    21.         ps = NULL;
    22.     }
    23.     ~Shape()
    24.     {
    25.         if( ps != NULL )
    26.         {
    27.             std::cout << "\n\nDone...";
    28.             delete[] ps;
    29.         }
    30.     }
    31.  
    32.     virtual void display( std::ostream& out ) const = 0;
    33. };
    34.  
    35. class ColorShape : public Shape
    36. {
    37. protected:
    38.     int color;
    39. public:
    40.     ColorShape( int col = 0 )
    41.         :Shape()
    42.     {
    43.         color = col;
    44.     }
    45.  
    46.     void display( std::ostream& out ) const;
    47. };
    48.  
    49. void ColorShape::display( std::ostream& out ) const
    50. {
    51.     out << "I'am ColorShape\n";
    52. }
    53.  
    54.  
    55.  
    56. class Rectangle : public ColorShape
    57. {
    58. public:
    59.     Rectangle( const Point& a, const Point& b, int col )
    60.         :ColorShape( col )
    61.     {
    62.         ps = new Point[ 2 ];
    63.         ps[ 0 ] = a;
    64.         ps[ 1 ] = b;
    65.     }
    66.  
    67.     void display( std::ostream& out ) const
    68.     {
    69.         ColorShape::display( out );
    70.         out << "I'm also Rectangle\n";
    71.     }
    72. };
    73.  
    74. /*
    75.     - Polymorphism
    76. */
    77. std::ostream& operator <<( std::ostream& out, const Shape* shp )
    78. {
    79.     shp->display( out );
    80.     return out;
    81. }
    82.  
    83. int main()
    84. {
    85.     /*
    86.         - list of shapes
    87.     */
    88.     Shape* los;
    89.  
    90.     los = new  Rectangle( Point( 50, 50 ), Point( 100, 100 ), 15 );
    91.  
    92.     std::cout << los << "\n";
    93.  
    94.  
    95.     delete los;
    96.  
    97.     return 0;
    98. }

  3. #3
    Ngày gia nhập
    03 2008
    Bài viết
    0

    Cám ơn bạn đã góp ý ! Mình sẽ coi lại style viết code !

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    cậu xem các hàm ảo của cậu xem nó có khác nhau gì không ? Hàm ảo là gì ? Nó tương tự như nó có cái vẻ giống nhau nhưng nội dung bên trong khác nhau, muốn thể hiện tính ảo thì nó bắt buộc phải có cái vỏ giống nhau ( tên hàm, tham số truyền vào ). Vì sao ? Vì cơ bản là abstract chỉ dựa vào v-tables mà gọi hàm, nếu nó khác thì nó sẽ không có trong v-table.
    Mình đã xem lại trong đoạn code của mình , mình viết các virtual void display() giống nhau (cùng tên , kiểu trả về ,cùng tham số )trong các lớp mà ! Không hiểu sao , không chạy đc ?????Cứ ấm ức mãi chỗ này ??

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    - Cậu khởi tạo con trỏ trong main(), delete của cậu đâu ?
    Mình cứ tưởng là việc dọn dẹp sẽ do hàm hủy bỏ dọn dẹp chứ ???
    C++ Code:
    1. int main()
    2. {
    3.     /*
    4.         - list of shapes
    5.     */
    6.     Shape* los;
    7.     los = new  Rectangle( Point( 50, 50 ), Point( 100, 100 ), 15 );
    8.     std::cout << los << "\n";
    9.     delete los;
    10.  
    11.     return 0;
    12. }
    los tạo ra 1 đối tượng Rectangle , thì cuối chương trình sẽ gọi hàm hủy bỏ của lớp Rectangle (hoặc lớp Shape ) sẽ đc gọi chứ bạn ??? hay là mình hiểu sai nhỉ
    Thứ hai em phải đi học
    Thứ ba em cũng vì học phải đi
    Thứ tư đi học nên đi
    Thứ năm càng phải vội đi để học
    Thứ sáu em cũng phải siêng
    Thứ bảy bận quá vì học phải đi
    Chủ nhật thủng thẳng nghĩ suy
    Ở nhà buồn quá có khi đi học

    Học hoài , học nữa , học tiếp có khi hộc máu
    Học cho lắm tắm hổng có quần thay
    Học cho hay cũng thay hoài cái quần cũ

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mình đã xem lại trong đoạn code của mình , mình viết các virtual void display() giống nhau (cùng tên , kiểu trả về ,cùng tham số )trong các lớp mà ! Không hiểu sao , không chạy đc ?????Cứ ấm ức mãi chỗ này ??
    virtual ở đâu ra đây ????
    Code:
    virtual void display(){
            /*setcolor(color);
            rectangle(ps[0]._x(),ps[0]._y(),ps[1]._x(),ps[1]._y());
            floodfill((ps[0]._x() + 1),(ps[0]._y() + 1),color);*/
                              cout<<"goi ham display cua Rectangles";
        }
    Mình cứ tưởng là việc dọn dẹp sẽ do hàm hủy bỏ dọn dẹp chứ ???
    Khởi tạo với new -> + delete, trong C++ không có bộ dọn rác sẵn như trong C#, Java hay .Net.

Các đề tài tương tự

  1. [ Solved ]Mình đưa ra đoạn code xin chỉ dùm mình lỗi sai
    Gửi bởi chickencake1 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 20-11-2008, 03:32 PM
  2. [Solved]kiểm tra dùm đoạn code
    Gửi bởi kuaga trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 01-11-2008, 06:06 PM
  3. [Solved]xin mọi người sửa dùm các bai tập C cơ bản
    Gửi bởi thanh_rio trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 22-10-2008, 11:25 PM
  4. [ Solved ]Ai giúp dùm bài tập cơ bản !
    Gửi bởi MinhPro88 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 35
    Bài viết cuối: 25-09-2008, 10:28 PM
  5. [Solved] Giải thích dùm mình bài file này
    Gửi bởi lovedtn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 19-09-2008, 07:38 PM

Quyền hạn của bạn

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