C++. ATM Project ver.6


1.更新内容

기존 배열클래스(account array class)를 클래스 템플릿으로 재 정의 하여 다양한 반환형으로 배열객체에 접근할 수 있도록 한다.

2.更新理由


フラットオブジェクトにアクセスする場合、通常はアドレス値を使用してアクセスしますが、場合によってはオブジェクトのレプリケーション値のみが要求される場合があるため、シェイプ(type)の流動性を考慮してクラステンプレートとして再定義したい場合があります.さらに、2つの異なる[]演算子overload関数を既存のarrayclassに統合することで、クラスの簡潔性を得ることができます.

3.コード&説明


7つのヘッダファイルとソースファイルはすべてリストされません.変更あり

  • accountarray.h

  • accountarray.cpp

  • accounthandler.h
    コメントしたコードだけで分析してみましょう
  • accountarray.h
    #include "account.h"
    #include <iostream>
    #pragma once
    using namespace std;
    
    /*클래스 템플릿*/
    template <typename T>
    class Accountarray
    {
    private:
    	T * arr;
    // 복사생성자, 대입연산자 방지
    	int len;
    	Accountarray(Accountarray& Acopy);
    	Accountarray& operator=(Accountarray& Acopy);
    
    public:
    // 생성자 - 동적할당
    	Accountarray();
    // []연산자 오버로드 함수, 하나로 통합! - 반환형을 자유롭게
    	T& operator[](int idx); 	
    	int Getlen();
    // 소멸자
      ~Accountarray();
    };
    
    accountarray.cpp
    #include "string.h"
    #include "accountarray.h"
    #include <cstdlib> // exit function
    #include "account.h"
    
    // 클래스 템플릿 정의
    /* template 선언 이후에..
    1. 해당 클래스 템플릿 함수가 임의 형(type)를 필요로 하면 template <typename T>
    2. 해당 클래스 템플릿 함수가 임의 형을 필요로 하지 않는 함수라면 template<>
    으로 선언한다
    */
    // 생성자
    template <typename T>
    Accountarray<T>::Accountarray()
        :len(100)
    {
        arr = new T[100]; // 배열 동적할당, 임의형 T는 사용자로부터 입력되어야 하는 값
    }
    
    // []연산자 오버로드 함수
    template <typename T>
    T& Accountarray<T>::operator[](int idx)
    {
    // out of range
        if (idx < 0 || idx >= len)
        {
            cout << "out of range" << endl;
            exit(1);
        }
    // 배열의 idx번째 인자를 임시 T&형으로 반환한다.
        return arr[idx];
    }
    
    // 소멸자
    template <> // 함수 내에서 typename T가 필요하지 않은 경우
    Accountarray<T>::~Accountarray()
    {
       delete []arr; 
    }
    accounthandler.h
    #include "accountarray.h"
    #include "account.h"
    #pragma once
    
    /*Controller class*/
    class Accounthandler 
    {
    private:
    	Accountarray<ACCOUNT_PTR> acc; 
    // Account의 포인터형인 ACCOUNT_PTR을 typename 'T'값으로 한 Accountarray 객체 acc를 생성  
    	int acc_count; // 고객번호
    public:
    	// 생성자
    	Accounthandler();
    	// 기능함수(메뉴, 생성, 입금, 출금, 조회)
    	void Menu();
    	void Make();
    	void Deposit();
    	void Withdraw();
    	void Show();
    };

    4.結果


    結果はverです.5に示すように、添付ではなく、ヘッダファイルとソースファイルが保存されている完全なビューが表示されます.
  • replitでオンライン開発を行い、他のローカルコンパイラを使用しても同じコンパイルと実行が行われます.
  • 5.結論


    配列クラスをクラステンプレートとして再定義することで、定義を使用して複数のタイプのテンプレートクラス(互換性)を呼び出すことができます.しかし、このプロジェクトではあまり意味がないようで、防止と言える.