пытается отсортировать вектор объектов с помощью операторов сравнения - PullRequest
2 голосов
/ 26 октября 2019

Я пытаюсь реализовать карточную игру, и я использую вектор карт. Я реализовал каждый оператор сравнения с надеждой, что функция сортировки будет сортировать по этим операторам, но я всегда получаю, что туз - самая маленькая карта.

Я пробовал сортировать вручную, но это стало очень уродливо.

class Card {

    int worth;
    int num;
    Shapes shape_id;
    string name;
    string shape_name;
    string color;
    char symbol;
    string intToShape(int n);
    string intToColor(int n);
public:
    Card(int n, int shap);
    Card();
    int getNumOfCard() const;
    int getShapeOfCard() const;
    friend std::ostream& operator<<(std::ostream& os, const Card& c);
    bool operator >(Card& other);
    bool operator <(Card& other);
    bool operator ==(Card& other);
    bool operator >=(Card& other);
    bool operator <=(Card& other);
    bool operator !=(Card& other);
};

c'or of card:

Card::Card(int n, int shap) : num(n) , shape_id((Shapes)shap) {
    if (num>10 || num ==1) {
        switch (num) {
            case 11:
                name = "Jack" + intToShape(shap);
                symbol ='J';
                break;
            case 12:
                name = "Quin" + intToShape(shap);
                symbol = 'Q';
                break;
            case 13:
                name = "King" + intToShape(shap);
                symbol = 'K';
                break;
            case 1:
                name = "Ace" + intToShape(shap);
                symbol = 'A';
                break;
            default:
                string exceptionMessage("num > 13"); 
                throw (PckErr(exceptionMessage));
        }
    } else {
        symbol = 'N';
        name = std::to_string(num) + intToShape(shap);
    }
    if (num == 1) {
        worth = 14;  //ace worth 14!
    } else {
        worth = num;
    }
    shape = intToShape(shap);
    color = intToColor(shap);
}

сортирующая часть:

for (int i = 0; i < 12; ++i) {
    histogram[pCard[i]->getNumOfCard()]++;
    it = sorted_hand.insert(it,pCard[i]);
}
std::sort(sorted_hand.begin(), sorted_hand.end());

реализация операторов:

bool Card::operator>(Card &other) {
    return this->worth > other.worth;
}

bool Card::operator<(Card &other) {
    return this->worth < other.worth;
}

... same for all

Iожидаемый отсортированный вектор из 5 карт: 2,3,4,5,1, но фактический вектор: 1,2,3,4,5.

1 Ответ

3 голосов
/ 26 октября 2019

Я могу придумать несколько способов справиться с проблемой.

Решение 1

Присвойте асу 14 значение.

Решение 2

Учет особого характера туза в функции сравнения.

bool Card::operator<(Card &other) {
    int l = (this->worth == 1) ? 14 : this->worth;
    int r = (other.worth == 1) ? 14 : other.worth;
    return (l < r);
}

Предложение по очистке.

Измените функцию для работы с const объектами.

bool Card::operator<(Card const& other) const {
    int l = (this->worth == 1) ? 14 : this->worth;
    int r = (other.worth == 1) ? 14 : other.worth;
    return (l < r);
}
...