✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2025-01-02 01:46:16
조회수 666

컴공 일기261

게시글 주소: https://ys.orbi.kr/00070988182

  • 동적 배열을 즉석에서 한번 구현해봤습니다.

이동시맨틱, 대입연산, 복사생성, …, 자료출력 등등 구현을 했습니다만

결정적으로 l-value [] 연산을 지원을 안하고 있습니다.


따라서, 객체가 생성될 때 극한의 효율로 생성이 되게 했고, 자료 출력도 가능하게 했습니다만

사용자 코드 쪽에서 동적 배열 객체의 값들을 초기화해서 사용할 수 있도록 [] 연산에 대한 오버로딩을 해줘야 합니다.


간단하지만 그건 시간이 늦은 관계로 내일… 하겠습니다.


이동시맨틱 연습 겸 짜본 코드지요…


자고로, 여기에서 탬플릿과 상속을 조금 더 추가해 봄 직 합니다.

며칠 간은 계속 손을 볼 예제죠. 아직 미완성입니다.

극한의 추상성을 제공해보려고요.


vector STL 흉내 내보겠다는 건데,

객체지향 프로그래밍 공부할 때 이 자세가 중요하지 않나 생각합니다.


흉내를 우선 낼 줄 알아야, 창조를 할 수 있는 거니까요.


#pragma once

#include <iostream>

using namespace std;

class dynamic_array

{

    public:

      

        dynamic_array() = default;

        explicit dynamic_array(int n);

        dynamic_array(const dynamic_array&);

        dynamic_array(dynamic_array&&) noexcept;

        int* begin() const;

        int* end() const;

        const int getSize() const;

        void PrintData() const;

        int operator[] (const int index) const;

        

        dynamic_array operator+(const dynamic_array&);

        dynamic_array& operator=(const dynamic_array&);

        dynamic_array& operator=(dynamic_array&&) noexcept;

        ~dynamic_array();


    private:

        int* data = nullptr;

        int size = 0;

};

dynamic_array::dynamic_array(int n)

{

    cout << "dynamic_array(int)" << endl;

    data = new int[n];

    size = n;

}

dynamic_array::dynamic_array(const dynamic_array& rhs)

{

    cout << "dynamic_array(const dynamic_array&)" << endl;

    this->size = rhs.getSize();

    data = new int[size];

    for(int i=0; i<size; i++)

    {

        data[i] = rhs.data[i];

    }

}

dynamic_array::dynamic_array(dynamic_array&& rhs) noexcept

{

    cout << "dynamic_array(dynamic_array&&)" << endl;

    //의도적인 shallow copy

    this->data = rhs.data;

    this->size = rhs.getSize();

    rhs.data = nullptr;  

    rhs.size = 0;

}

dynamic_array::~dynamic_array()

{

    delete[] data;

}

int* dynamic_array::begin() const 

{

    return data;

}

int* dynamic_array::end() const

{

    return data+size;

}

const int dynamic_array::getSize() const

{

    return size;

}

void dynamic_array::PrintData() const

{

    for(int i=0; i<this->getSize(); i++)

    {

        cout << this->data[i] << " ";

    }

    cout << endl;

}

int dynamic_array::operator[](const int index) const

{

    if(index < 0 || index >= this->getSize())

    {

        cout << "Invalid Index!!" << endl;

        exit(-1);

    }

    return this->data[index];

}

dynamic_array dynamic_array::operator+(const dynamic_array& rhs)

{

    dynamic_array retVal(this->getSize() + rhs.getSize());

    copy(this->begin(), this->end(), retVal.begin());

    copy(rhs.begin(), rhs.end(), retVal.begin() + this->getSize());

    return std::move(retVal);

}

dynamic_array& dynamic_array::operator=(const dynamic_array& rhs)

{

    cout << "dynamic_array::operator=(dynamic_array&)" << endl;

    if(data != nullptr)

       delete[] data;

    data = new int[rhs.getSize()];

    for(int i=0; i<rhs.getSize(); i++)

    {

        data[i] = rhs[i];

    }

    size = rhs.getSize();

    return *this;  

}

dynamic_array& dynamic_array::operator=(dynamic_array&& rhs) noexcept 

{

    cout << "dynamic_array::operator=(dynamic_array&&)" << endl;

    if (this != &rhs) { // 자기 대입 방지

        if (data != nullptr) {

            delete[] data;

        }

        data = rhs.data;

        size = rhs.size;

        rhs.data = nullptr;

        rhs.size = 0;

    }

    return move(*this);

}



0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.