Operator= overloading

Operator= overloading

本文关键字:overloading Operator      更新时间:2023-10-16

因此,在我现在正在学习的课程中,我们被分配了一个项目,我一直在努力找出如何正确地深度复制一个卡数组。下面我将发布我正在处理的类的整个.cpp和.h,我很确定它在operator=函数中,但我真正想要的只是一些关于如何修复它的提示。vector不允许使用,字符串也不允许使用。这是一门初级课程,所以我们不知道太多。我收到的主要错误是_BLOCK_TYPE_is_VALID(pHead->nBlockUse)请提前感谢。

//.h
#pragma once
#include "stdafx.h"
#include "Card.h"

class Player
{
private:
// Needed for unit tests
// DO NOT REMOVE OR RENAME
char* m_name;           // Can change size of array if needed
Card* m_hand;       // Can change size of array if needed

int m_numCards;     // The number of cards the player is currently holding
int m_maxCards;     // The number of cards the player can store (the number of elements in Hand)
int m_score;
public:
Player(const char* _name = "Player", int _maxCards = 5);
Player(const Player& _cpy);
virtual ~Player();
Player& operator=(const Player& _assign);
const char* GetName() const { return m_name; }
bool GetCard(int, Card&) const;
int GetNumCards() const { return m_numCards; }
int GetMaxCards() const { return m_maxCards; }
int GetScore() const { return m_score; }
/*MUTATORS*/
void SetName(const char* _name);
void AddToScore(int addScore);
bool AddCard(Card);
bool Discard(int index, Card&);
void Clear();
virtual void Show() const;


// Needed for unit tests
// DO NOT REMOVE
friend class CTestManager;
};

//.cpp
#include "Player.h"
Player::Player(const char* _name, int _maxCards){
m_name = NULL;
SetName(_name);
m_hand = NULL;
m_hand = new Card[_maxCards];

m_maxCards = _maxCards;
m_numCards = 0;
m_score = 0;
}
Player::Player(const Player& _cpy)
{
m_name = NULL;
SetName(_cpy.m_name);
m_hand = NULL;
m_hand = new Card(*_cpy.m_hand);

m_maxCards = _cpy.m_maxCards;
m_numCards = _cpy.m_numCards;
m_score = _cpy.m_score;
}
Player::~Player(){
delete[] m_name;
delete[] m_hand;
}
Player& Player::operator=(const Player& _assign)
{
if (this != &_assign)
{
delete[] m_name;
SetName(_assign.m_name);
delete[] m_hand;
//enter implemented deep copy here//
m_maxCards = _assign.m_maxCards;
m_numCards = _assign.m_numCards;
m_score = _assign.m_score;
}
return *this;
}
bool Player::GetCard(int index, Card& _Card) const{
if (index < m_numCards && index >= 0){
_Card = m_hand[index];
return true;
}
return false;
}
/*MUTATORS*/
void Player::SetName(const char* _name){
delete[] m_name;
int len = strlen(_name) + 1;
m_name = new char[len];
strcpy_s(m_name, len, _name);
}
void Player::AddToScore(int addScore){
m_score += addScore;
}
bool Player::AddCard(Card _addCard){
if (m_numCards != m_maxCards){
m_hand[m_numCards++] = _addCard;
return true;
}
return false;
}
bool Player::Discard(int discardIndex, Card& _discardCard){
if (discardIndex >= m_numCards){
return false;
}
else{
_discardCard = m_hand[discardIndex];
for (int i = discardIndex; i < m_maxCards - 1; i++){
m_hand[i] = m_hand[i + 1];
}
m_numCards--;
return true;
}
}
void Player::Clear(){
m_numCards = 0;
}
void Player::Show() const{
}

如果有人能给我什么建议,我将不胜感激:D再次感谢。

使用std::vector并完成它。它支持赋值。这个问题(在我写这篇文章的时候)并没有表明禁止使用std::vector

听起来更像是一个代码审查类的问题,但无论如何,这里有一些"提示":

您的复制构造函数Player(const Player& _cpy)没有正确复制数组,您需要循环遍历_cpy.m_hand并复制每个元素,您所做的基本上只是复制第一张卡,并使m_hand指向单个堆元素,而不是数组。这将在以后删除它时导致错误,因为您假设m_hand是dtor中的一个数组(delete[]m_hand)。

Player& Player::operator=(const Player& _assign)在这里,您需要首先分配一个阵列来保存副本,然后执行for循环并将每个卡复制到新阵列。

例如

m_hand = new Card[_assign.m_maxCards]; 
for (int i = 0; i < _assign.m_numCards; ++i)
{
m_hand[i] = _assign.m_hand[i]; 
}
m_maxCards = _assign.m_maxCards;
...

重要提示:复制卡片的方式取决于您如何实现Card类,但您还没有提供Card的声明,所以我只是假设它是POD类型。如果它包含更复杂的结构,那么你需要一些方法来克隆它的内容。

附带说明:当您声明一个类时,将公共部分放在该类的第一位,实现细节通常会更好地隐藏在视图之外,并且对于该类的用户来说通常不会(不应该)特别感兴趣。

如果必须使用这些旧的C风格字符串,那么创建一个模拟strdup()的小辅助函数可能是个好主意

char* newdup( const char* str )
{
char* ret = NULL;
if ( str != NULL )
{
ret = new char[strlen( str ) + 1];
strcpy_s( ret, len, str );
}
return ret; 
}

您必须复制Player类中的每个成员,因此通过重载=运算符在Card类中实现一个方法,该运算符在Card类别中进行深度复制。然后你可以在播放器的方法中使用=运算符,只需添加

m_hand=_assign.m_hand;