2 minute read

🔭프로그램 설명

  • 예제 StablePointPtrArray.cpp 에서 정의한 BoundCheckPointPtrArray 클래스를 본 프로젝트에 맞게 변경시켜 적용하고자 한다. 그리고 일부 클래스에 대해 깊은 복사를 진행하도록 대입 연산자도 오버로딩 하고자 한다.

  • Account 클래스는 깊은 복사를 진행하도록 복사 생성자가 정의되어 있다. 따라서 대입 연산자도 깊은 복사가 진행되도록 정의하는 것이 좋다. 배열이 멤버로 전언되어 객체의 저장을 주도하는 클래스에, 이번 챕터에서 정의한 배열 클래스로 대체한다.

🖥️구현

  • AccountPtrArr.h

      #pragma once
    
      #include"Stage_7_Account.h"
    
      typedef Account* ACCOUNT_PTR;
    
      class BoundCheckAccountPtrArray 
      {
      private:
          ACCOUNT_PTR* m_pAcount= nullptr;
          int m_iArrLen = 0;
          BoundCheckAccountPtrArray(const BoundCheckAccountPtrArray& bcArrPtr);
          BoundCheckAccountPtrArray& operator=(const BoundCheckAccountPtrArray& arr);
    
      public:
          BoundCheckAccountPtrArray();
          ~BoundCheckAccountPtrArray();
          ACCOUNT_PTR& operator[] (int idx);
          const ACCOUNT_PTR operator[](int idx) const;
          int GetArrLen() const;
      };
    
    
  • AccountPtrArr.cpp

    #include"Stage_7_BankDec.h"
      #include "Stage_8_AccountArray.h"
    
      BoundCheckAccountPtrArray::BoundCheckAccountPtrArray() : m_iArrLen(50)
      {
          m_pAcount = new ACCOUNT_PTR[50];
      }
    
      BoundCheckAccountPtrArray::~BoundCheckAccountPtrArray()
      {
          delete [] m_pAcount;
      }
    
      ACCOUNT_PTR& BoundCheckAccountPtrArray::operator[](int idx)
      {
          if (idx < 0 || idx >= m_iArrLen)
          {
              cout << "Array Index Out of Bound Exception" << endl;
              exit(1);
          }
          return m_pAcount[idx];
      }
    
      const ACCOUNT_PTR BoundCheckAccountPtrArray::operator[](int idx) const
      {
          if (idx < 0 || idx >= m_iArrLen)
          {
              cout << "Array Index Out of Bound Exception" << endl;
              exit(1);
          }
          return m_pAcount[idx];
      }
    
      int BoundCheckAccountPtrArray::GetArrLen() const
      {
          return m_iArrLen;
      }
    
  • Account.h

    #pragma once
    
      class Account
      {
      public:
          Account(int id, char* name, int balance);
          Account(const Account& ref);
          ~Account();
    
      private:
          int m_Id;			// 계좌번호
          char* m_cpName;		// 이름
          int m_Balance;		// 잔고
    
      public:
          Account& operator=(const Account& ref);
          int getID() const;
          virtual int Deposit(int monyey);
          int Withdraw(int money);
          void ShowAccInfo() const;
      };
    
  • Account.cpp

      #define _CRT_SECURE_NO_WARNINGS
    
      #include "Stage_7_Account.h"
      #include"Stage_7_BankDec.h"
    
    
      ///////////////// 계좌 /////////////////////////
    
      Account::Account(int id, char* name, int balance) : m_Id(id), m_Balance(balance)
      {
          m_cpName = new char[strlen(name) + 1];
          strcpy(m_cpName, name);
      }
    
      Account::Account(const Account& ref)
          : m_Id(ref.m_Id), m_Balance(ref.m_Balance) 
      {
          m_cpName = new char[strlen(ref.m_cpName) + 1];
          strcpy(m_cpName, ref.m_cpName);
      }
    
      Account::~Account()
      {
          delete[]m_cpName;
      }
    
      Account& Account::operator=(const Account& ref)
      {
          m_Id = ref.m_Id;
          m_Balance = ref.m_Balance;
    
          delete[]m_cpName;		//대입연산자는 두 객체가 모두 초기화 된 상태이므로, 먼저 이름을 지워준다
          m_cpName = new char[strlen(ref.m_cpName)+1];
          strcpy(m_cpName, ref.m_cpName);
          return *this;
      }
    
      int Account::getID() const {
          return m_Id;
      }
    
      int Account::Deposit(int money) {
          m_Balance += money;
          return m_Balance;			// 잔액 반환
      }
    
      int Account::Withdraw(int money) {
          if (m_Balance - money < 0) {
              return -1;
          }
    
          m_Balance -= money;
          return m_Balance;
      }
    
      void Account::ShowAccInfo() const {
          cout << "계좌번호 : " << m_Id << endl;
          cout << "이    름 : " << m_cpName << endl;
          cout << "잔    액 : " << m_Balance << endl;
      }
    
  • 코드가 나름 좀 복잡하게 되어버렸고, 실제로는 이렇게 코딩을 하는 경우는 드물다고 한다.
  • BoundCheckPtrArray를 만들어 적용하려다 보니 이게 꾸역꾸역 이렇게 된 것 같은데,
    객체, 포인터, 포인터의 포인터, 그것의 배열이 나오다 보니 너무 헷갈려서 그림으로 정리를 해보았다.

fail to bring

Tags: ,

Categories:

Updated: