Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Lỗi pure virtual function call -> nguyên nhân là do hàm hủy tự động gọi @@

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

    Mặc định Lỗi pure virtual function call -> nguyên nhân là do hàm hủy tự động gọi @@

    Nguyên nhân của lỗi thì mình tìm ra rồi .Nhưng mà cách sửa thì bó tay @@

    Nếu post code lên chắc sẽ khó trình bày nên xin cho phép mình đưa project lên luôn.

    Đặt BreakPoint ở hàm ~Figure() và ~Reca() thì sẽ thấy trình biên dịch tự động dịch đoạn code này mặc dù không hề gọi nó

    Còn ai thấy phiền thì mình để code lên vậy :p

    SVG.h
    C++ Code:
    1. class SVG//SVG là lớp dùng để đọc file .svg sau đó vẽ hình từ file .svg đó
    2. {
    3. private:
    4.     //thuộc tính bao gồm các hình mà SVG có thể vẽ
    5.     vector<Figure*> figure;
    6. public:
    7.     SVG();
    8.     ~SVG();
    9.     SVG(const SVG& svg);
    10.  
    11.     //phương thức bao gồm việc đọc file sau đó vẽ hình dựa trên dữ liệu đọc được
    12.    
    13.     void LoadSVG(string name);
    14.  
    15.     void SVGDraw(HDC hdc);
    16. };
    SVG.cpp
    C++ Code:
    1. void SVG::SVGDraw(HDC hdc)
    2. {
    3.     for(int i = 0;i < this->figure.size();i++)
    4.         this->figure[i]->Draw(hdc);
    5. }
    6.  
    7. void SVG::LoadSVG(string name)
    8. {
    9.    
    10.     ifstream input(name);
    11.    
    12.     string input_xml;
    13.     string line;
    14.  
    15.     if(!input)//không đúng đường dẫn thì thoát ra
    16.         return;
    17.  
    18.     //đọc file vào chuỗi input_xml
    19.     while(getline(input,line))
    20.         input_xml += line;
    21.  
    22.     input.close();
    23.  
    24.     vector<char> xmlCopy(input_xml.begin(),input_xml.end());//chuyển input_xml từ string thành vector<char> vì sẽ có 1 số hàm cần sử dụng trong char
    25.     xmlCopy.push_back('\0');//với ký tự kết thúc là NULL
    26.  
    27.     xml_document<> doc;//Tạo đối tượng là tập tin xml
    28.  
    29.     doc.parse<parse_declaration_node | parse_no_data_nodes>(&xmlCopy[0]);
    30.  
    31.     xml_node<> *node = doc.first_node();//Tạo ra node để duyệt file node này sẽ giữ phần tử đầu của file
    32.  
    33.     node = node->first_node();//nhảy tới node tiếp theo tức tab tiếp theo vì cấu trúc của file SVG nên ta cần dòng này
    34.  
    35.     do//phần đọc
    36.     {
    37.         if(string(node->name()) == "rect")//Mỗi một node gồm có 2 thuộc tính : tên và giá trị
    38.         {
    39.             Reca temp;
    40.             for(xml_attribute<>  *attr = node->first_attribute();
    41.             attr;attr = attr->next_attribute())//duyệt hết tất cả các thuộc tính
    42.             {
    43.                 temp.SetAttribute(attr->name(),attr->value());
    44.             }
    45.  
    46.             Figure* temp_fig;
    47.             temp_fig = &temp;
    48.             this->figure.push_back(temp_fig);
    49.         }//Sau BreakPoint thì trình biên dịch nhảy tiếp chỗ này
    50.  
    51.         node = node->next_sibling();//nhảy tới tab tiếp theo cùng cấp
    52.     }while(node);//đọc qua từng thẻ cùng cấp của node hiện tại
    53. }

    Figure.h
    C++ Code:
    1. class Figure
    2. {
    3. protected:
    4.     Color strokeColor;
    5.     int strokeWidth;
    6.     float strokeOpacity;
    7.  
    8.     Color fillColor;
    9.     float fillOpacity;
    10.  
    11.     int translateX;
    12.     int translateY;
    13.  
    14.     float rotateAxax;
    15. public://Các phương thức chính
    16.     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
    17.     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
    18.                                                        //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
    19.    
    20.     void Design(Color strokeColor,float strokeWidth,float strokeOpacity,Color fillColor,float fillOpacity);//Các phần như tô màu,độ sáng
    21. public://Hàm khởi tạo
    22.     Figure();
    23.     virtual ~Figure();
    24.  
    25. protected://phương thức hỗ trợ
    26.     void ColorOpacity(Color &color,float opacity);//dùng để hiệu chỉnh độ sáng của color
    27. };

    Figure.cpp
    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. Figure::~Figure()//BreakPoint1
    16. {
    17. }

    Reca.h
    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://Hàm Khởi tạo
    17.     Reca();
    18.     Reca(int x,int y,int width,int height);//Thiết lập các thuộc tính còn lại
    19.     ~Reca();
    20. };

    Reca.pp
    C++ Code:
    1. //Các hàm khởi tạo
    2. Reca::Reca():Figure()
    3. {
    4.     x = y = 0;
    5.     width = height = 0;
    6. }
    7. Reca::Reca(int x,int y,int width,int height):Figure()
    8. {
    9.     this->x = x;
    10.     this-> y = y;
    11.     this-> width = width;
    12.     this->height = height;
    13.  
    14.     this->SetStrokeWidth(2);//riêng Rect nên có bề dày đường viền là 2
    15. }
    16. Reca::~Reca()
    17. {
    18. }

    Mediafire Link Code:
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi vipzero : 08-12-2012 lúc 10:25 PM.

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

    @@~. Tìm nguyên nhân hay ghê nhỉ? Code sai chỗ này nè, đưa vào danh sách địa chỉ của 1 đối tượng cục bộ, sau khi ra khỏi khối lệnh, đối tượng bị giải phóng mất tiêu lấy gì mà gọi hàm???
    C++ Code:
    1.         if(string(node->name()) == "rect")//Mỗi một node gồm có 2 thuộc tính : tên và giá trị
    2.         {
    3.             Reca temp;
    4.             for(xml_attribute<>  *attr = node->first_attribute();
    5.             attr;attr = attr->next_attribute())//duyệt hết tất cả các thuộc tính
    6.             {
    7.                 temp.SetAttribute(attr->name(),attr->value());
    8.             }
    9.  
    10.             Figure* temp_fig;
    11.             temp_fig = &temp;
    12.             this->figure.push_back(temp_fig);
    13.         }
    14.  
    15.         if(string(node->name()) == "circle")
    16.         {
    17.             Circle temp;
    18.             for(xml_attribute<> *attr = node->first_attribute();
    19.                 attr;attr = attr->next_attribute())
    20.             {
    21.                 temp.SetAttribute(attr->name(),attr->value());
    22.             }
    23.  
    24.             Figure* temp_fig;
    25.             temp_fig = &temp;
    26.             this->figure.push_back(temp_fig);
    27.         }
    28.         if(string(node->name()) == "line")
    29.         {
    30.             Line temp;
    31.             for(xml_attribute<> *attr = node->first_attribute();
    32.                 attr;attr = attr->next_attribute())
    33.             {
    34.                 temp.SetAttribute(attr->name(),attr->value());
    35.             }
    36.  
    37.             Figure* temp_fig;
    38.             temp_fig = &temp;
    39.             this->figure.push_back(temp_fig);
    40.         }
    41.         if(string(node->name()) == "ellipse")
    42.         {
    43.             Elli temp;
    44.             for(xml_attribute<> *attr = node->first_attribute();
    45.                 attr;attr = attr->next_attribute())
    46.             {
    47.                 temp.SetAttribute(attr->name(),attr->value());
    48.             }
    49.  
    50.             Figure* temp_fig;
    51.             temp_fig = &temp;
    52.             this->figure.push_back(temp_fig);
    53.         }
    54.         if(string(node->name()) == "polyline")
    55.         {
    56.             Poly temp;
    57.  
    58.             for(xml_attribute<> *attr = node->first_attribute();
    59.                 attr;attr = attr->next_attribute())
    60.             {
    61.                 temp.SetAttribute(attr->name(),attr->value());
    62.             }
    63.  
    64.             Figure* temp_fig;
    65.             temp_fig = &temp;
    66.             this->figure.push_back(temp_fig);
    67.         }
    68.         if(string(node->name()) == "polygon")
    69.         {
    70.             Polyg temp;
    71.  
    72.             for(xml_attribute<> *attr = node->first_attribute();
    73.                 attr;attr = attr->next_attribute())
    74.             {
    75.                 temp.SetAttribute(attr->name(),attr->value());
    76.             }
    77.  
    78.             Figure* temp_fig;
    79.             temp_fig = &temp;
    80.             this->figure.push_back(temp_fig);
    81.         }
    Sửa lại như sau:
    C++ Code:
    1.         if(string(node->name()) == "rect")//Mỗi một node gồm có 2 thuộc tính : tên và giá trị
    2.         {
    3.             Figure* temp_fig = new Reca;
    4.             for(xml_attribute<>  *attr = node->first_attribute();
    5.             attr;attr = attr->next_attribute())//duyệt hết tất cả các thuộc tính
    6.             {
    7.                 temp_fig->SetAttribute(attr->name(),attr->value());
    8.             }
    9.             this->figure.push_back(temp_fig);
    10.         }
    11.  
    12.         if(string(node->name()) == "circle")
    13.         {
    14.             Figure* temp_fig = new Circle;
    15.             for(xml_attribute<> *attr = node->first_attribute();
    16.                 attr;attr = attr->next_attribute())
    17.             {
    18.                 temp_fig->SetAttribute(attr->name(),attr->value());
    19.             }
    20.             this->figure.push_back(temp_fig);
    21.         }
    22.         if(string(node->name()) == "line")
    23.         {
    24.             Figure* temp_fig = new Line;
    25.             for(xml_attribute<> *attr = node->first_attribute();
    26.                 attr;attr = attr->next_attribute())
    27.             {
    28.                 temp_fig->SetAttribute(attr->name(),attr->value());
    29.             }
    30.             this->figure.push_back(temp_fig);
    31.         }
    32.         if(string(node->name()) == "ellipse")
    33.         {
    34.             Figure* temp_fig = new Elli;
    35.             for(xml_attribute<> *attr = node->first_attribute();
    36.                 attr;attr = attr->next_attribute())
    37.             {
    38.                 temp_fig->SetAttribute(attr->name(),attr->value());
    39.             }
    40.             this->figure.push_back(temp_fig);
    41.         }
    42.         if(string(node->name()) == "polyline")
    43.         {
    44.             Figure* temp_fig = new Poly;
    45.  
    46.             for(xml_attribute<> *attr = node->first_attribute();
    47.                 attr;attr = attr->next_attribute())
    48.             {
    49.                 temp_fig->SetAttribute(attr->name(),attr->value());
    50.             }
    51.             this->figure.push_back(temp_fig);
    52.         }
    53.         if(string(node->name()) == "polygon")
    54.         {
    55.             Figure* temp_fig = new Polyg;
    56.  
    57.             for(xml_attribute<> *attr = node->first_attribute();
    58.                 attr;attr = attr->next_attribute())
    59.             {
    60.                 temp_fig->SetAttribute(attr->name(),attr->value());
    61.             }
    62.             this->figure.push_back(temp_fig);
    63.         }
    P/s 1: Vì tạo đối tượng bằng toán tử new, nên cần bổ sung toán tử delete để giải phóng đối tượng. Cái này cài tuỳ theo yêu cầu của bạn.
    P/s 2: hàm "SVG::SVG(const SVG& svg)" có vấn đề, xem lại cách dùng con trỏ đi. Còn lỗi linh tinh ở vài chỗ nữa. ~>"<~ Lắm bug thế không biết!

    Attached Thumbnails Attached Thumbnails report.png  
    Đã được chỉnh sửa lần cuối bởi doicanhden : 06-12-2012 lúc 11:45 PM.
    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

    thanks nha doicanhden :x
    P/s 1: Vì tạo đối tượng bằng toán tử new, nên cần bổ sung toán tử delete để giải phóng đối tượng. Cái này cài tuỳ theo yêu cầu của bạn.
    P/s 2: hàm "SVG::SVG(const SVG& svg)" có vấn đề, xem lại cách dùng con trỏ đi. Còn lỗi linh tinh ở vài chỗ nữa. ~>"<~ Lắm bug thế không biết!
    Mấy cái đó là warning chứ không phải lỗi .Do không cần bận tâm về việc kiểu byte hay float .
    giống như

    Code:
    int b = 5;
    float a = b * 10;
    dù có ép kiểu hay không kết quả vẫn vậy

    [/QUOTE]

  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
    Mấy cái đó là warning chứ không phải lỗi .
    @@~ Bạn có xem lại chỗ tôi nói chưa??? Và cái hàm tạo sao chép bên dưới cũng dính phải lỗi cấp phát nữa.
    C++ Code:
    1. SVG::SVG(const SVG& svg)
    2. {
    3.     for(int i = 0;i < svg.figure.size();i++)
    4.     {
    5.         Figure* temp; // <------ Câu lệnh này, và câu lệnh dưới.
    6.         *temp = *svg.figure[i]; //chi lay gia tri // <------- Lúc này con trỏ temp trỏ vào đâu? Mà bạn dùng toán tử deref vậy?
    7.         this->figure.push_back(temp);
    8.     }
    9. }
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

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

    Code:
    SVG::SVG(const SVG& svg)
    {
        for(int i = 0;i < svg.figure.size();i++)
        {
            Figure* temp; // <------ Câu lệnh này, và câu lệnh dưới.
            *temp = *svg.figure[i]; //chi lay gia tri // <------- Lúc này con trỏ temp trỏ vào đâu? Mà bạn dùng toán tử deref vậy?
            this->figure.push_back(temp);
        }
    }
    ừa nhỉ ! Ca này khó à :-?

    Mình tính dùng phương pháp khởi tạo bằng tên lớp .Sau đó ứng với mỗi tên thì cho
    Code:
    temp = new Reca ;
    temp = new Circle ;
    ...
    ngoài cách đó ra còn cách nào nữa không ?
    Đã được chỉnh sửa lần cuối bởi vipzero : 07-12-2012 lúc 12:36 PM.

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

    Mặc định Lỗi pure virtual function call -> nguyên nhân là do hàm hủy tự động gọi @@

    Trích dẫn Nguyên bản được gửi bởi vipzero Xem bài viết
    ừa nhỉ ! Ca này khó à :-?

    Mình tính dùng phương pháp khởi tạo bằng tên lớp .Sau đó ứng với mỗi tên thì cho
    C++ Code:
    1.     for(int i = 0;i < svg.figure.size();i++)
    2.     {
    3.         Figure* temp = nullptr;
    4.         switch (svg.figure[i]->type)
    5.         {
    6.         case type_e::Circle:
    7.             temp = new Circle(*reinterpret_cast<Circle*>(svg.figure[i]));
    8.             break;
    9.         //...........................
    10.         default:
    11.             break;
    12.         }
    13.         if (temp != nullptr)
    14.             this->figure.push_back(temp);
    15.     }
    P/s: Tôi có hứng với bài tập của bạn đấy. Cho tôi xin cái đề án được không?
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

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

    P/s: Tôi có hứng với bài tập của bạn đấy. Cho tôi xin cái đề án được không?
    phần đầu : cài đặt các lớp GDI+

    phần hai : Cài đặt lớp SVG để đọc file SVG

    phần ba : Cài đặt đa hình cho lớp Figure và Attribute

    phần bốn : Kỹ thuật tạo đối tượng bằng tên lớp

    Nói ngắn gọn lại là xây dựng hàm đọc file SVG sao cho có thể nâng cấp ,bảo trì dễ dàng được
    Đã được chỉnh sửa lần cuối bởi vipzero : 07-12-2012 lúc 06:50 PM.

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

    @@. Đưa link nguyên thư mục luôn đi. :[[. Mà này, trong mấy cái link bạn đưa tôi thấy có phần hướng dẫn rất kĩ. Ngay cả cái lỗi mà bạn sai lúc đầu kìa, link cuối đó.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  9. #9
    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
    @@. Đưa link nguyên thư mục luôn đi. :[[. Mà này, trong mấy cái link bạn đưa tôi thấy có phần hướng dẫn rất kĩ. Ngay cả cái lỗi mà bạn sai lúc đầu kìa, link cuối đó.
    link nguyên thư mục thì mình phải down về rồi bỏ lại up lên nữa mà link thì có sẵn rồi làm vậy phiền lắm :d

    Mình tính dùng phương pháp khởi tạo bằng tên lớp
    thì cái đó mình nói ở trên rồi đó

  10. #10
    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
    link nguyên thư mục thì mình phải down về rồi bỏ lại up lên nữa mà link thì có sẵn rồi làm vậy phiền lắm :d
    ~>"<~. Bạn không hiểu ý tôi rồi. Ý tôi là bạn gửi chưa đủ. Phần link bạn đưa chỉ là hướng dẫn, tôi không cần cái này. Còn cái đề gốc đâu??? Yêu cầu của đề là gì?? Bài tập số 1 là gì??
    P/s: Đừng nói tôi tham nhé, cho tôi nguyên bộ giáo trình của bạn luôn đi.
    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. Bài tập C++ Inheritance - virtual/pure virtual
    Gửi bởi jonathan_nguyen trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 09-02-2013, 10:53 AM
  2. Call to undefined function "nhandoi" in function main()
    Gửi bởi webboyk trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 19-06-2012, 10:09 PM
  3. Gặp lỗi khi sử dụng Virtual Function
    Gửi bởi alkill 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: 11-08-2011, 06:47 PM
  4. Gặp lỗi Call to undefined function 'a' , 'b', 'c' "?
    Gửi bởi Buomvang trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 31-03-2010, 03:26 PM
  5. [ Solved ]Cho tôi hỏi về Virtual function
    Gửi bởi petepan86 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 09-10-2006, 11:41 AM

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