C++/C to C++
[C to C++] 구조체를 클래스로 재정의하기
nodeal
2019. 1. 29. 16:46
반응형
추가되는 사항
- 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;
}
};반응형