#ifndef SIMPLE_VECTOR
#define SIMPLE_VECTOR
template <typename T>
class SimpleVector {
private:
T* data;
int currentSize;
int currentCapacity;
public:
SimpleVector() : currentSize(0), currentCapacity(10), data(new T[10]) {}
SimpleVector(int capacity) : currentSize(0), currentCapacity(capacity), data(new T[capacity]) {}
SimpleVector(const SimpleVector<T>& other)
: currentCapacity(other.currentCapacity),
currentSize(other.currentSize),
data(new T[other.currentCapacity]) {
for (int i = 0; i < currentSize; ++i) {
data[i] = other.data[i];
}
}
~SimpleVector() {
delete[] data;
}
void resize(int newCapacity);
void push_back(const T& value);
void popback();
size_t size() const;
size_t capacity() const;
};
template <typename T>
void SimpleVector<T>::resize(int newCapacity) {
if (newCapacity > currentCapacity){
T* newData = new T[newCapacity];
for (int i = 0; i < currentSize; ++i) {
newData[i] = data[i];
}
delete[] data;
data = newData;
currentCapacity = newCapacity;
}
}
#endif
이번주 캠프 첫번째 과제가 커스텀 벡터를 만들어서 구현해보는 것이라 만들고 있는 중이다.
난생 처음으로 소스코드가 아닌 헤더파일을 만들어서 ifndef
, define
endif
를 써보았다. 순서대로 만약 특정매크로가 정의되지 않았으면
, 정의하겠다.
, 특정매크로를 여기까지 정의
라는 뜻으로 헤드가드 역할 즉, 혹시나 있을 중복을 막는 역할을 한다.
우선 그냥 main.cpp 파일에만 코드를 작성할줄 알았지 헤드파일에는 어떤것이 들어가야 하는지, 또 어떻게 나누고 실행할 땐 어떤식으로 되는 것인지 몰랐었다. 우선 일반적으로는 헤드파일에는 대부분 클래스를 선언하고, 확장자는 .h
로 한다. 외부에서 접근 가능한 인터페이스를 정의하는데 즉, 클래스의 멤버변수, 생성자, 멤버함수의 프로토타입만 작성하고 구현은 제외하는 형태이다.
이제 구현 파일을 .cpp
, .tpp
에 작성을 한다. 템플릿 클래스의 경우는 컴파일 시점에 자료형이 결정, 일반적으로 .cpp
파일에 정의 할 수 없으므로 구현을 .tpp
파일에 작성하고 이를 헤더파일에 포함(#include) 하는 방식으로 처리한다. 아니면 구현도 헤더파일에 작성하더라도 괜찮긴하다.
사실 오늘 헤더파일에 멤버변수, 메소드 등을 정의하고 tpp 파일을 만드려는데 도저히 안보여서 cpp 파일에 작성을 하다가 계속 오류가 나서 왜 안되는 지 한참을 찾아보다가 결국 메소드 정의부분도 헤더파일에서 작성을 하기로 하고 작성했다.
또한 도전과제에 있었던 복사생성자의 개념도 생소해서 감이 잘 오지않았다. 객체를 다른 객체로 초기화할때 호출 되는 생성자이고, 기존 객체의 데이터를 복사하여 새로운 객체를 생성하는 특별한 생성자이다. 그러니깐 객체를 복사하게 되면 발동되는 함수랄까. 오늘 뭔가 코드를 작성하는데 뭔가 계속 막히는 기분이 들고 막막한 느낌이 들었다.