티스토리 뷰

추가되는 사항

    • C++에서 명시적으로 멤버 변수를 가려야할 경우 class를 활용한다.

    • struct와 다르게 class는 기본 접근 지정자가 private이고 외부에서 접근을 허용할 경우 public으로 지정해야한다.
      class Object {
          int pri;
      
          public:
          int pub;
      };
      
      Object o;
      o.pri = 10; // Error
      o.pub = 10; // OK
      

    • class 외부에서 멤버 변수 또는 함수에 접근을 막을 경우 private 기호를 활용한다.
      class Object {
          private:
          int pri;
          void foo() {}
      
          public:
          int pub;
          void bar() {}
      };
      
      Object o;
      o.pri = 10; // Error
      o.foo(); // Error
      o.pub = 10; // OK
      o.bar(); // OK
      

목표

    • C++ 구조체로 구현된 vector를 C++ 클래스로 구현한다.

    • 접근 지정자를 이용하여 외부 접근을 막아야 하는 경우를 구별한다.

디자인

    • vector의 다음 멤버 변수는 private으로 정의한다.
      • int* data
      • int capacity
      • int length

    • vector의 다음 멤버 함수는 private으로 정의한다.
      • int ensure_capacity(int to_add)
      • void increase_capacity()

    • vector의 다음 멤버 함수는 public으로 정의한다.
      • void initialize()
      • void finalize()
      • void add(int element)
      • int get(int index)
      • int set(int index, int element)
      • int remove(int index)
      • void print()

구현

#include <iostream>
#include <algorithm>

constexpr int INITIAL_SIZE = 10;

class vector {
    private:
    int* data;
    int capacity;
    int length;
    
    bool ensure_capacity(int to_add) const {
        return length + to_add < capacity;
    }
    
    void increase_capacity() {
        auto tmp = data;
        data = new int[capacity * 2];
        std::copy(tmp, tmp + length, data);
        delete[] tmp;
        capacity *= 2;
    }
    
    public:
    void initialize() {
        data = new int[INITIAL_SIZE];
        capacity = INITIAL_SIZE;
        length = 0;
    }
    
    void finalize() {
        delete[] data;
    }
    
    void add(int element) {
        if (!ensure_capacity(1))
            increase_capacity();
        
        *(data + length++) = element;
    }
    
    int get(int index) const {
        return *(data + index);
    }
    
    int set(int index, int element) {
        auto tmp = *(data + index);
        *(data + index) = element;
        return tmp;
    }
    
    int remove(int index) {
        auto tmp = *(data + index);
        auto tail_length = length - index - 1;
        auto tail = new int[tail_length];
        std::copy(data + index + 1, data + length, tail);
        std::copy(tail, tail + tail_length, data + index);
        delete[] tail;
        length--;

        return tmp;
    }
    
    void print() const {
        std::cout << '{';
        for (int i = 0; i < length; i++)
            std::cout << *(data + i) << ((i < length - 1) ? ", " : "");
        std::cout << '}' << std::endl;
    }
};


댓글
댓글쓰기 폼