2014-01-17 185 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; 
}