저는 솔리테어 게임을 학습 연습으로 모델링하기 위해 C++ 클래스를 만들었습니다.const 참조 또는 boost :: shared_ptr을 사용해야합니까?
나는 SolitaireGame, CardStack (보드에 10 장의 카드 중 하나)과 카드를위한 수업을 가지고 있습니다. 나의 현재 모델은 SolitaireGame이 104 개의 카드 객체의 벡터를 소유하고 있다고 말합니다 - 나는 이것을 '신발'이라고 부릅니다. SolitaireGame은 또한 신발에 저장된 Card 객체의 주소 중 본질적으로 deque 인 10 개의 CardStacks를 추적합니다. 갑판과 손은 CardStack에서 상속받습니다. 나는 갑판에서 카드를 신발에 보관 된 원래 물건을 가리키는 포인터를 통해 손으로 캐스케이드로 전달합니다.
나는 this 질문에 대한 답변의 수에 따라 카드의 포인터를 전달해서는 안되지만 const 참조를 사용해야합니다. 그 이유는 벡터에 저장된 객체의 주소가 이동 될 수 있기 때문에 어디서나 주소를 저장하는 것이 더 바람직하지 않기 때문입니다. 나는 최근 boost :: sharedptr을보고 시작했다. 여기에 shared_ptr을 사용하여 사람들이 생각하는 것은 무엇입니까? 여기
클래스의 간략화 된 버전이다 :
class SolitaireGame
{
public:
SolitaireGame::SolitaireGame(int numsuits);
private:
vector<Card> _shoe;
Deck _deck;
Hand _hand;
CardStack _cols[NUM_COLUMNS];
int _numsuits;
GameState gamestate;
};
class CardStack
{
public:
CardStack(){ cout << "CardStack constructor" << endl; }
CardStack(const CardStack&);
CardStack(const deque<Card *> &d);
~CardStack(){ }
virtual Card * PullCard(Face f);
virtual void PushCard(Card * c);
Card * CardAt(int i) const;
Card * Top() const;
deque<Card *>::iterator Begin() { return _cards.begin(); }
deque<Card *>::iterator End() { return _cards.end(); }
int Size() const;
CardStack& operator=(const CardStack& rhs);
friend std::ostream& operator<<(std::ostream &os, const CardStack &obj);
private:
deque<Card *> _cards;
는};
답장을 보내 주셔서 감사합니다. 그래, 내가 어떻게 작동하는지 상상하는 방법이다. 하나의 게임은 삭제되지만 카드는 모두 지워지기 때문에 삭제된다. 카드가 동적으로 할당되지 않았기 때문에 내 코드가 합리적으로 안전하다는 것을 알았습니다. 그리고 신발에는 항상 변경되지 않는 104 개의 카드가 포함되어 있습니다. – BeeBand
나는 이것에 완전히 동의한다 (+1). 내가 추가 할 수있는 유일한 것은 (const로) 참조 (아직 CardStack에 포인터로 저장)로 카드를 전달하는 것입니다. 내 정책은 NULL이 유효한 값 인 경우에만 함수 인수와 반환 값을 포인터로 사용합니다. 그렇지 않으면 참조를 사용합니다. 이렇게하면 카드를 사용하기 전에 카드가 유효한지 확인/주장 할 필요가 없으므로 NULL이 유효하지 않다는 것을 프로그래머에게 분명히 알릴 수 있습니다. –