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

Đề tài: bad ptr string trong hàm khởi tạo của lớp dẫn xuất

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    16

    Mặc định bad ptr string trong hàm khởi tạo của lớp dẫn xuất

    Nếu mình đặt debug ở hàm dựng của Figure và Reca thì sẽ thấy :
    sau khi khởi tạo Figure thì lúc nhảy sang dụng Reca thì tất cả các thuộc tính Attribute::name mà Reca kế thừa từ Figure đều mất hết dữ liệu

    Mình có lớp Figure được khai báo và cài đặt hàm khởi tạo như sau :

    C++ Code:
    1. class Figure
    2. {
    3. protected:
    4.     vector<Attribute*> attribute;//Phục vụ cho việc rút gọn hàm SetAttribute
    5.  
    6.     Color strokeColor;
    7.     int strokeWidth;
    8.     float strokeOpacity;
    9.  
    10.     Color fillColor;
    11.     float fillOpacity;
    12.  
    13.     int translateX;
    14.     int translateY;
    15.  
    16.     float rotateAxax;
    17.  
    18.     //Các phương thức chính
    19. public:
    20.     virtual void Draw(HDC hdc) = 0;//Chỉ có lớp dẫn xuất(lớp con) mới cài đặt và khi lớp cha gọi hàm này thì sẽ được gọi hàm tương ứng trong lớp con
    21.     virtual void SetAttribute(char* name,char* value); //Cả lớp con(lớp dẫn xuất) và lớp cha(lớp cơ sở) đều có thể cài đặt
    22.                                                        //và khi lớp cha gọi hàm này thì sẽ được gọi hàm tương ứng trong lớp con
    23.    
    24.     void Design(Color strokeColor,float strokeWidth,float strokeOpacity,Color fillColor,float fillOpacity);//Các phần như tô màu,độ sáng
    25.  
    26. public://Hàm khởi tạo
    27.     Figure();
    28.     virtual ~Figure();
    29. }

    C++ Code:
    1. Figure::Figure()
    2. {
    3.     strokeColor.SetValue(Color::Black);//màu đen
    4.     strokeWidth = 2;//Nên để là 2 thì nhìn thấy rõ hơn
    5.     strokeOpacity = 1.0;
    6.    
    7.     fillColor.SetValue(Color::White);//màu trắng
    8.     fillOpacity = 1.0;
    9.    
    10.     rotateAxax = 0;
    11.  
    12.     translateX = 0;
    13.     translateY = 0;
    14.  
    15.     //attribute trỏ tới đám thuộc tính ở trên và thiết lập name tương ứng cho các thuộc tính
    16.     Attribute* tempStrokeColor;
    17.     tempStrokeColor = &UpdatedColor(strokeColor);
    18.     tempStrokeColor->SetName("stroke");
    19.     this->attribute.push_back(tempStrokeColor);
    20.  
    21.     Attribute* tempStrokeWidth;
    22.     tempStrokeWidth = &Int(strokeWidth);
    23.     tempStrokeWidth->SetName("stroke-width");
    24.     this->attribute.push_back(tempStrokeWidth);
    25.  
    26.     Attribute* tempStrokeOpacity;
    27.     tempStrokeOpacity = &Float(strokeOpacity);
    28.     tempStrokeOpacity->SetName("stroke-opacity");
    29.     this->attribute.push_back(tempStrokeOpacity);
    30.  
    31.     Attribute* tempFillColor;
    32.     tempFillColor = &UpdatedColor(fillColor);
    33.     tempFillColor->SetName("fill");
    34.     this->attribute.push_back(tempFillColor);
    35.  
    36.     Attribute* tempFillOpacity;
    37.     tempFillOpacity = &Float(fillOpacity);
    38.     tempFillOpacity->SetName("fill-opacity");
    39.     this->attribute.push_back(tempFillOpacity);
    40.  
    41.     Attribute* tempRotateAxax;
    42.     tempRotateAxax = &Float(rotateAxax);
    43.     tempRotateAxax->SetName("rotate");
    44.     this->attribute.push_back(tempRotateAxax);
    45.  
    46.     Attribute* tempTranslateX;
    47.     tempTranslateX = &Int(translateX);
    48.     tempTranslateX->SetName("translate-x");
    49.     this->attribute.push_back(tempTranslateX);
    50.  
    51.     Attribute* tempTranslateY;
    52.     tempTranslateY = &Int(translateY);
    53.     tempTranslateY->SetName("translate-y");
    54.     this->attribute.push_back(tempTranslateY);
    55. }

    Lớp Reca kế thừa Figure :

    C++ Code:
    1. class Reca : public Figure//recangle : hình chữ nhật
    2. {
    3. private://Các thuộc tính không được truy cập
    4.     int x;
    5.     int y;
    6.     int width;//chiều rộng
    7.     int height;//chiều cao
    8.  
    9. public://Các phương thức Thiết kế va vẽ
    10.  
    11.     void Draw(HDC hdc);//đọc hình chữ nhật và vẽ nó trên nền hdc
    12. public:
    13.     ////Thiết lập thuộc tính dựa trên file SVG
    14.     //void SetAttribute(char* name,char* value);
    15.  
    16. public://Phương thức lấy giá trị đặc trưng của Rect
    17.     int GetX();
    18.     int GetY();
    19.     int GetWidth();
    20.     int GetHeight();
    21.  
    22. public://Phương thức thay đổi các giá trị đặc trưng của Rect
    23.     void SetShape(int x,int y,int width,int height);//thay đổi hình dáng thành Rec khác
    24.  
    25. public://Hàm Khởi tạo
    26.     Reca();
    27.     Reca(int x,int y,int width,int height);//Thiết lập các thuộc tính còn lại
    28.     ~Reca();
    29. };

    C++ Code:
    1. Reca::Reca():Figure()
    2. {
    3.     x = y = 0;
    4.     width = height = 0;
    5.  
    6.     //attribute trỏ tới đám thuộc tính ở trên và thiết lập name tương ứng cho các thuộc tính
    7.     Attribute* tempX;
    8.     tempX = &Int(x);
    9.     tempX->SetName("x");
    10.     this->attribute.push_back(tempX);
    11.  
    12.     Attribute* tempY;
    13.     tempY = &Int(y);
    14.     tempY->SetName("y");
    15.     this->attribute.push_back(tempY);
    16.  
    17.     Attribute* tempWidth;
    18.     tempWidth = &Int(width);
    19.     tempWidth->SetName("width");
    20.     this->attribute.push_back(tempWidth);
    21.  
    22.     Attribute* tempHeight;
    23.     tempHeight = &Int(height);
    24.     tempHeight->SetName("height");
    25.     this->attribute.push_back(tempHeight);
    26.  
    27. }


    Phần khai báo và cài đặt Attribute :
    C++ Code:
    1. class Attribute
    2. {
    3. protected:
    4.     string name;
    5.  
    6. public://Khởi tạo và hủy
    7.     Attribute();
    8.     Attribute(const Attribute&);
    9.     virtual ~Attribute();
    10.    
    11. public://Các hàm chính
    12.     virtual void SetValueAttribute(char* value) = 0;
    13.    
    14. public://Thiết lập thuộc tính
    15.     void SetName(string name);
    16.  
    17. public://Lấy giá trị thuộc tính
    18.     string GetName();
    19. };

    C++ Code:
    1. Attribute::Attribute()
    2. {
    3.     this->name = "";
    4. }
    5. Attribute::Attribute(const Attribute& attr)
    6. {
    7.     this->name = attr.name;
    8. }
    9. Attribute::~Attribute()
    10. {
    11. }
    12.  
    13. void Attribute::SetName(string name)
    14. {
    15.     this->name = name;
    16. }
    17.  
    18. string Attribute::GetName()
    19. {
    20.     return this->name;
    21. }

    Nếu thấy khó nhìn quá thì các bạn có thể debug thử project
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi vipzero : 08-12-2012 lúc 10:16 PM.

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi vipzero Xem bài viết
    Nếu mình đặt debug ở hàm dựng của Figure và Reca thì sẽ thấy :
    sau khi khởi tạo Figure thì lúc nhảy sang dụng Reca thì tất cả các thuộc tính Attribute::name mà Reca kế thừa từ Figure đều mất hết dữ liệu

    Mình có lớp Figure được khai báo và cài đặt hàm khởi tạo như sau :

    C++ Code:
    1. Figure::Figure()
    2. {
    3.     strokeColor.SetValue(Color::Black);//màu đen
    4.     strokeWidth = 2;//Nên để là 2 thì nhìn thấy rõ hơn
    5.     strokeOpacity = 1.0;
    6.    
    7.     fillColor.SetValue(Color::White);//màu trắng
    8.     fillOpacity = 1.0;
    9.    
    10.     rotateAxax = 0;
    11.  
    12.     translateX = 0;
    13.     translateY = 0;
    14.  
    15.     //attribute trỏ tới đám thuộc tính ở trên và thiết lập name tương ứng cho các thuộc tính
    16.     Attribute* tempStrokeColor;
    17.     tempStrokeColor = &UpdatedColor(strokeColor);
    18.     tempStrokeColor->SetName("stroke");
    19.     this->attribute.push_back(tempStrokeColor);
    20.  
    21.     Attribute* tempStrokeWidth;
    22.     tempStrokeWidth = &Int(strokeWidth);
    23.     tempStrokeWidth->SetName("stroke-width");
    24.     this->attribute.push_back(tempStrokeWidth);
    25.  
    26.     Attribute* tempStrokeOpacity;
    27.     tempStrokeOpacity = &Float(strokeOpacity);
    28.     tempStrokeOpacity->SetName("stroke-opacity");
    29.     this->attribute.push_back(tempStrokeOpacity);
    30.  
    31.     Attribute* tempFillColor;
    32.     tempFillColor = &UpdatedColor(fillColor);
    33.     tempFillColor->SetName("fill");
    34.     this->attribute.push_back(tempFillColor);
    35.  
    36.     Attribute* tempFillOpacity;
    37.     tempFillOpacity = &Float(fillOpacity);
    38.     tempFillOpacity->SetName("fill-opacity");
    39.     this->attribute.push_back(tempFillOpacity);
    40.  
    41.     Attribute* tempRotateAxax;
    42.     tempRotateAxax = &Float(rotateAxax);
    43.     tempRotateAxax->SetName("rotate");
    44.     this->attribute.push_back(tempRotateAxax);
    45.  
    46.     Attribute* tempTranslateX;
    47.     tempTranslateX = &Int(translateX);
    48.     tempTranslateX->SetName("translate-x");
    49.     this->attribute.push_back(tempTranslateX);
    50.  
    51.     Attribute* tempTranslateY;
    52.     tempTranslateY = &Int(translateY);
    53.     tempTranslateY->SetName("translate-y");
    54.     this->attribute.push_back(tempTranslateY);
    55. }
    Tôi đã nhắc nhở bạn xem lại kiếm thức về con trỏ và cấp phát động, tạo đối tượng bằng toán tử new. Có vẻ như bạn bỏ ngoài tai. Vậy thì nên dừng project lại đi. Code sai be bét kiểu này thì có mà làm đến tết.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  3. #3
    Ngày gia nhập
    09 2011
    Bài viết
    16

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    Tôi đã nhắc nhở bạn xem lại kiếm thức về con trỏ và cấp phát động, tạo đối tượng bằng toán tử new. Có vẻ như bạn bỏ ngoài tai. Vậy thì nên dừng project lại đi. Code sai be bét kiểu này thì có mà làm đến tết.
    ặc mấy cái phần đó đợi đến lúc làm FigureManager đi đã đang quan trọng cái Attribute

    Nếu làm theo như cấp phát động :

    C++ Code:
    1. Attribute* temp = new Int(stroke);

    thì nó không đúng với thiết kế vì cái mình cần con trỏ temp sẽ trỏ đến stroke để khi thay đổi *(temp->value) thì sẽ thay đổi stroke

    mà nếu làm như thế này

    C++ Code:
    1. Attribute* temp = new Int;
    2. temp = &stroke;

    thì như vậy sẽ bị lỗi chưa xóa vùng nhớ Int vừa cấp phát
    Đã được chỉnh sửa lần cuối bởi vipzero : 08-12-2012 lúc 11:14 PM.

  4. #4
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi vipzero Xem bài viết
    ặc mấy cái phần đó đợi đến lúc làm FigureManager đi đã đang quan trọng cái Attribute

    Nếu làm theo như cấp phát động :

    C++ Code:
    1. Attribute* temp = new Int(stroke);

    thì nó không đúng với thiết kế vì cái mình cần con trỏ temp sẽ trỏ đến stroke để khi thay đổi *(temp->value) thì sẽ thay đổi stroke

    mà nếu làm như thế này

    C++ Code:
    1. Attribute* temp = new Int;
    2. temp = &stroke;

    thì như vậy sẽ bị lỗi chưa xóa vùng nhớ Int vừa cấp phát
    Vậy chuyển sang dùng smart pointer của thư viện STL đi. Cụ thể là lớp template std::shared_ptr trong thư viện memory.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

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

  1. Đếm số lần xuất hiện substring trong string trong C#?
    Gửi bởi sieu_ke trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 27-08-2013, 05:47 PM
  2. Lập trình C++ Đếm số lần ký tự nào đó xuất hiện trong 1 string
    Gửi bởi ha.1312 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 02-05-2013, 01:02 PM
  3. Method String.CompareTo(string strB) trong C# thực hiện so sánh 2 chuỗi như thế nào?
    Gửi bởi tpqnnd trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 27-05-2012, 10:52 AM
  4. Lập trình C++ sử dụng string trong C++. Lỗi C2146: syntax error : missing ';' before identifier tại string string_rep()const;?
    Gửi bởi levanvuonglvv trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 15-09-2011, 10:28 PM
  5. Gặp vấn trong class String đề với truy xuất operator []
    Gửi bởi baobienmuaha trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 09-07-2011, 07:49 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