2014-01-17 248 views
-1

因此,我們現在正在爲班級分配一個項目,並且我試圖弄清楚如何正確深度複製一系列卡片。下面我將發佈整個.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再次感謝。

+0

成語*](http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Copy-and-swap)。 – juanchopanza

+0

有關建議,請參閱此[常見問題](https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom) – 2014-01-17 06:53:42

回答

1

使用std::vector並完成它。它支持分配。這個問題(正如我寫的那樣)並不表示禁止使用std::vector

+0

是的,抱歉,我忘記提供有關這是一個初學者的信息類,我們不允許使用std :: vector或字符串,因爲我們「不知道他們中的任何一個」......但是...... – user2076582

+1

@ user2076582儘管如此,總體思路還是很好的:你似乎有在你的類中有兩個動態分配的數組('m_name'和'm_hand'),因此將「可複製和可分配的運行時大小的數組」分解爲單個類模板,然後在你的'Player'類中重用。這樣'Player'不必進行任何內存管理,並且您可以簡單地使用隱式生成的拷貝構造函數,賦值運算符和析構函數。 – juanchopanza

0

您必須複製Player類中的每個成員,因此通過overloading = operator在Card類中實現深度複製的Card類中的方法。然後,您可以在播放器的方法中使用=運算符,只需添加

m_hand = _assign.m_hand;

1

聽起來更像是一個代碼審查這類的問題,但無論如何這裏有一些「竅門」:

你的拷貝構造函數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; 
}