簡體   English   中英

運算符=重載

[英]Operator= overloading

因此,我們在我現在正在上的課程中分配了一個項目,而我一直試圖找出如何正確深層復制Card系列的方法。 在下面,我將為正在處理的類發布整個.cpp和.h,我可以肯定它位於operator =函數中,但是我真正想要的只是關於如何修復它的一些技巧。 向量不允許使用,字符串也不允許使用。 這是一門初學者,所以我們知道的並不太多。 我收到的主要錯誤是_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

聽起來更像是codereview之類的問題,但無論如何,這里有一些“技巧”:

您的復制構造函數Player(const Player& _cpy)不能正確復制數組,您需要遍歷_cpy.m_hand並復制每個元素,您要做的基本上是復制第一張卡並將m_hand指向單個堆元素而不是數組。 由於您假設m_hand是dtor中的數組(刪除[] 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類中進行深度復制。 然后,您只需在Player的方法中使用=運算符,只需添加

m_hand = _assign.m_hand;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM