반응형
Card_one.h
#pragma once #includeCard_one.cpp#include #include //전방선언. 이런 클래스가 나올거라고 알려주는 의미. class Card_deck; const char SPADE[3] = "♠"; const char DIAMOND[3] = "◆"; const char HEART[3] = "♥"; const char CLUB[3] = "♣"; class Card_one { int pattern; int number; bool open; bool showData(); bool setOpen(bool onoff); bool getOpen(); //생성자도 private이므로 일반적인 방법으로는 객체 생성이 안되는 클래스. Card_one(); Card_one(int p, int n); ~Card_one(); //카드 덱 클래스를 friend 지정. friend class Card_deck; };
#include "Card_one.h" bool Card_one::showData() { if (open == true) { switch (pattern) { case 0: std::cout << SPADE; break; case 1: std::cout << DIAMOND; break; case 2: std::cout << HEART; break; case 3: std::cout << CLUB; break; } switch (number) { case 1: std::cout << " A"; break; case 11: std::cout << " J"; break; case 12: std::cout << " Q"; break; case 13: std::cout << " K"; break; default: std::cout << " " << number; break; } std::cout << std::endl; return true; } else { std::cout << "???" << std::endl; return false; } } bool Card_one::setOpen(bool onoff) { open = onoff; return open; } bool Card_one::getOpen() { return open; } Card_one::Card_one() { pattern = 0; number = 0; open = false; } Card_one::Card_one(int p, int n) { pattern = p; number = n; open = false; } Card_one::~Card_one() { }Card_deck.h
#pragma once //friend 지정된 클래스에서는 해당 클래스에 대한 완전한 정보가 필요하다. #include "Card_one.h" class peep_deck { public: void peep_ok(Card_deck& D); //void peep_no(Card_deck& D); peep_deck() {} ~peep_deck() {} }; class Card_deck { private: Card_one Deck[52]; int currentCnt; public: void swapCard(Card_one& srcCard, Card_one& dstCard); void Shuffle(int cnt); void cardOpen(); Card_deck(); virtual ~Card_deck(); //friend 전역 함수 선언. //CntChoice 함수는 전역 함수가 되므로 Card_deck클래스의 멤버가 아니게 된다. friend void CntChoice(Card_deck&p, int n) { p.currentCnt = n; } //peep_deck 클래스의 peep_ok()메소드만 friend 지정 //특정 클래스의 멤버를 friend로 선언하려면 그 클래스의 선언이 이 클래스의 앞에 있고, 멤버 함수의 몸체는 뒤에 있어야 한다. friend void peep_deck::peep_ok(Card_deck& D); };Card_deck.cpp
#include "Card_deck.h" Card_deck::Card_deck() { //카드 세팅 for (int iCnt = 0; iCnt < 52; iCnt++) { switch (iCnt / 13) { case 0: Deck[iCnt] = Card_one(0, iCnt % 13 + 1); break; case 1: Deck[iCnt] = Card_one(1, iCnt % 13 + 1); break; case 2: Deck[iCnt] = Card_one(2, iCnt % 13 + 1); break; case 3: Deck[iCnt] = Card_one(3, iCnt % 13 + 1); break; } //특수문자는 char형의 표현범위를 벗어나기 때문에 경고가 발생한다. //C언어에서 특수문자나 다국어 처리는 상당히 까다로운 부분. //일단 여기서는 char를 wchar_t로 바꾸는 것으로 해결했다. //참고 : 멀티바이트, 유니코드, ICU(International Components for Unicode) } currentCnt = 0; } void Card_deck::swapCard(Card_one& srcCard, Card_one& dstCard) { Card_one temp = srcCard; srcCard = dstCard; dstCard = temp; } void Card_deck::Shuffle(int cnt) { srand((unsigned)time(NULL)); std::cout << "덱을 " << cnt << "번 섞습니다." << std::endl; for (int iCnt = 0; iCnt < cnt; iCnt++) { int src = rand() % 52; int dst = rand() % 52; swapCard(Deck[src], Deck[dst]); } std::cout << "덱을 섞었습니다." << std::endl; } void Card_deck::cardOpen() { Deck[currentCnt].open = true; Deck[currentCnt].showData(); currentCnt++; } Card_deck::~Card_deck() { } void peep_deck::peep_ok(Card_deck& D) { D.cardOpen(); D.currentCnt--; } //friend 선언 안한 함수에서는 접근 불가. //void peep_deck::peep_no(Card_deck& D) //{ // D.cardOpen(); // D.currentCnt--; //}main.cpp
#include "Card_deck.h" int main() { Card_deck deck; deck.Shuffle(100); deck.cardOpen(); //전역 함수가 되었으므로 볼 수 없다. //deck.CntChoice(deck, 42); CntChoice(deck,42); peep_deck pd; pd.peep_ok(deck); }
반응형