QSet<T>自定义类型需要定义==和qHash()函数

如题,QSet<T>中T为自定义类型需要重写==函数和qHash()函数。

示例:

//
// Created by qiaowei on 2024/5/9.
//


#ifndef LORDCARD_CARD_H
#define LORDCARD_CARD_H


#include <QObject>

#include "../enums/card_suit_enum.h"
#include "../enums/card_point_enum.h"
#include "../player/player.h"


using role::Player;
using card::Card_suit_enum;
using card::Card_point_enum;


namespace card {
	
    /**
     * @copyright 2003-2024
     * @date      2024-07-21
     * @author    qiao wei
     * @version   1.0
     * @brief     扑克牌类。
     * @history   name
                  date
                  brief
     */
    class Card : public QObject {
			
        Q_OBJECT
		
        public:
            explicit Card(QObject* parent = nullptr);
		
            /**
             * @author  qiao wei
             * @brief   拷贝构造函数。
             * @param   value 被拷贝的变量。
             * @return
             * @history name
                        date
                        brief
             */
            Card(const Card& value);
			
            ~Card() override;
			
            /**
             * @author  qiao wei
             * @brief   赋值操作符。
             * @param   value 被赋值的变量。
             * @return  value变量赋值后的
             * @history name
                        date
                        brief
             */
            Card& operator=(const Card& value);
			
            virtual Card_suit_enum suit() const;
			
            virtual void set_suit(Card_suit_enum suit);
			
            virtual Card_point_enum point() const;
			
            virtual void set_point(Card_point_enum point);
			
            virtual Player* player() const;
			
            virtual void set_player(Player* player);
			
        private:
            /**
            * @author qiao wei
            * @brief  扑克牌花色。
            */
            Card_suit_enum suit_;
			
            /**
            * @author qiao wei
            * @brief  扑克牌点数。
            */
            Card_point_enum point_;
			
            /**
             * @author qiao wei
             * @brief  玩家。
             */
            Player* card_player_;
    };
	
	/**
	 * @date    2023-09-09 10:28
	 * @author  qiao wei
	 * @version 1.0
	 * @brief   比较2个Card参数是否相等。QSet's value data type must be an assignable data type, the
	 *           type must provide operator==(), and there must also be a global qHash() function
	 *           that returns a hash value for an argument of the key's type.
	 * @param   left_card Card引用类型左参数。
	 * @param   right_card Card引用类型右参数
	 * @return  当两个参数的所有变量相等,返回true,反之返回false。
	 * @throws
	 */
	bool operator==(const Card& left_card, const Card& right_card);
	
	/**
	 * @date    2023-09-09 10:29
	 * @author  qiao wei
	 * @version 1.0
	 * @brief   Function that returns a hash value for an argument of the key's type
	 * @param
	 * @return
	 * @throws
	 */
	uint qHash(const Card& card);
	
} // card

#endif //LORDCARD_CARD_H



//
// Created by qiaowei on 2024/5/9.
//


#include "../../headers/cards/card.h"


namespace card {
	
	Card::Card(QObject *parent) : QObject(parent),
	                              card_player_{new Player{"No name", parent}} {
		
	}
	
	Card::Card(const Card &value) {
		if (nullptr != &value && this != &value) {
			this->point_ = value.point_;
			this->suit_ = value.suit_;
			
			if (nullptr == card_player_) {
				card_player_ = new Player{value.card_player_->name(), value.card_player_->group()};
			} else {
				card_player_->set_name(value.card_player_->name());
				card_player_->set_gruop(value.card_player_->group());
			}
		}
	}
	
	Card::~Card() {
		if (nullptr != card_player_) {
			delete card_player_;
			card_player_ = nullptr;
		}
	}
	
	Card &Card::operator=(const Card &value) {
		if (this == &value) {
			return *this;
		}
		
		// 对所有字段进行赋值,对值类型数据直接进行赋值,如果是指针类型数据需要new新对象。
		if (nullptr != &value) {
			this->point_ = value.point_;
			this->suit_ = value.suit_;
			
			if (nullptr == card_player_) {
				card_player_ = new Player(value.card_player_->name(), value.card_player_->group());
			} else {
				card_player_->set_name(value.card_player_->name());
				card_player_->set_gruop(value.card_player_->group());
			}
		}
		
		return *this;
	}
	
	Card_suit_enum Card::suit() const {
		return suit_;
	}
	
	void Card::set_suit(Card_suit_enum suit) {
		suit_ = suit;
	}
	
	Card_point_enum Card::point() const {
		return point_;
	}
	
	void Card::set_point(Card_point_enum point) {
		point_ = point;
	}
	
	Player *Card::player() const {
		return card_player_;
	}
	
	void Card::set_player(Player *player) {
		card_player_ = player;
	}
	
	bool operator==(const Card &left_card,
	                const Card &right_card) {
		
		bool result{false};
		
		if (&left_card == &right_card) {
			result = true;
		} else {
			result = (left_card.point() == right_card.point() && left_card.suit() == right_card.suit());
		}
		
		return result;
	}
	
	uint qHash(const Card &card) {
		return (int) card.point() * 314 + (int) card.suit() * 159;
	}
}
// card

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值