2013-05-03 51 views
7

Tôi có một vectơ của con trỏ lớp std::vector<Square*> listSquares. Tôi muốn sắp xếp nó với một trong các thuộc tính của lớp làm khóa. Đây là những gì tôi đang làmstd :: sort() trên vectơ của con trỏ Class

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 

std::sort(listSquares.begin(), listSquares.end(), compById) 

nhưng trình biên dịch nói: lỗi: không có chức năng phù hợp cho cuộc gọi đến 'sắp xếp (std :: vector :: iterator, std :: vector :: iterator, < chưa được giải quyết quá tải loại chức năng >) '

Tôi đang làm gì sai ở đây?

+6

Nếu bạn có thể sử dụng C++ 11, bạn nên thực hiện điều này một lambda: 'std :: sort (listSquares.begin(), listSquares.end(), [] (Square * a, Quảng trường * b) {return a-> getId() < b-> getId;}) '. – leftaroundabout

+2

Hãy chắc chắn rằng bạn thực sự muốn con trỏ và không chỉ là đối tượng, quá. – chris

+0

Tôi không thể sử dụng C++ 11. @chris Tôi chắc chắn tôi muốn sử dụng con trỏ. – qutab

Trả lời

12

Để sử dụng compById làm tham số std::sort, nó không phải là hàm thành viên. Điều này là sai

class Square 
{ 
    bool compById(Square* a, Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
    ... 
}; 

Điều này là tốt,

class Square 
{ 
    ... 
}; 

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 
+0

Cảm ơn bạn rất nhiều. Đây là vấn đề. Nhưng tại sao chúng ta không thể tuyên bố nó như một chức năng thành viên? Thực ra tôi đang sử dụng nó trong một lớp khác với chính hình vuông. – qutab

+2

Bởi vì làm thế nào sẽ std :: sắp xếp biết đối tượng để sử dụng khi nó gọi chức năng thành viên? Các hàm thành viên chỉ có thể được gọi trên các đối tượng, nhưng std :: sort không có ngữ cảnh để xác định đối tượng nào cần. Có lẽ bạn đang gọi std :: sắp xếp từ bên trong một số đối tượng, nhưng bạn không phải là đi qua đối tượng đó để std :: sort. std :: sort không biết gì về nó được gọi từ đâu, tất cả những gì nó biết là ba tham số mà bạn truyền vào nó. – john

+3

+1 cho kỹ năng telepathy – Basilevs

3

Phần quan trọng nhất bạn đang thiếu là các đối số cho hàm so sánh là const. Loại khác là kiểu trả về. Nếu bạn loại bỏ kiểu trả về khi khai báo một hàm, trình biên dịch sẽ giả sử nó trả về int mà không đúng trong trường hợp này.

Và tất nhiên, hàm so sánh phải nằm trong phạm vi khi bạn gọi hàm std::sort.

+0

Ngay cả khi tôi sử dụng const, tôi cũng gặp lỗi tương tự. Trong trường hợp này tôi cũng nhận được, gameplay.cpp: 911: lỗi: chuyển 'const Square' làm đối số 'this' của 'int Square :: getId()' loại bỏ vòng loại [-fpermissive] – qutab

+1

@qutab, bạn phải thực hiện Hàm getId() cũng là một hàm thành viên const. – richselian

1

Bạn có thể sử dụng một hàm thành viên. Nhưng bạn cần phải định nghĩa nó như là một hàm thành viên tĩnh và gọi nó từ lớp, không phải là một thể hiện của lớp.

Thông báo static trước khai báo hàm và Square:: trước tên hàm sắp xếp.

class Square 
{ 
    /*...*/ 
public: 
    static bool compById(const Square* a, const Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
}; 

main() 
{ 
    /*...*/ 
    std::sort(listSquares.begin(), listSquares.end(), Square::compById); 
} 
Các vấn đề liên quan