C++/Fundamentals of Data Structures in C++(Horowitz)

C++ Fundamentals of Data Structures(C++ 자료구조론) 2.2 연습문제

꾸준함. 2017. 7. 25. 16:32

/*

Implement a class CppArray which is identical to a one-dimensional C++ array except for the following:

다음 내용을 제외하고는 C++ 일차원배열과 동일한 CppArray 클래스를 구현하라

(i) it performs range checking

(i) 이 클래스는 범위를 체크한다

(ii) it allows one array to be assigned to another array through the use of the assgnment operator

(ii) 이 클래스는 = 연산자를 통해 다른 배열로 지정될 수 있다.

(iii) It supports a function that returns the size of the array

(iii) 이 클래스는 배열의 크기를 반환하는 함수를 가지고 있다.

(iv) It allows the reading or printing of arrays through the use of cin and cout

(iv) cin cout을 통해 배열 입출력이 가능하다

 

To do this, you will have to define the following member functions on CppArray:

위와 같이 수행하려면 CppArray 클래스에 다음의 멤버 함수들을 정의해야한다.

 

(a) A constructor CppArray(int size=defaultSize, float initvalue=defaultValue).

(a) CppArray 생성자(int size=디폴트size, float initvalue=디폴트Value)

(b) a copy constructor CppArray(const CppArray &cp2). This creates an array identical to cp2

    Copy constructors are used to initialize a class object with another class object as in the following:CppArray a=b;

(b) CppArray 복사생성자. 이는 cp2와 동일한 배열을 생성한다.

    복사생성자는 하나의 클래스 객체를 다른 클래스 객체로 초기화할 때 필요하다(예시: CppArray a=b;)

(c) An assignment operator CppArray &operator=(const CppArray &cp2). This replaces the original array with cp2

(c) =연산자를 통해 배열 정보를 바꾼다.

(d) A destructor ~CppArray()

(d) CppArray의 소멸자

(e) The subscript operator float &operator[](int i). This should be implemented so that it performs range-checking

(e) float &operator[](int i)와 같은 []연산자. 이는 범위를 체크할 때 필요하기 때문에 구현되어야한다.

(f) A member function int GetSize(). This returns the size of the array

(f) int GetSize() 멤버 함수. 이는 배열의 크기를 반환한다.

(g) Implement functions to read and print the elements of a CppArray by overloading operator << and >>

(g) 배열을 입력하고 출력하기 위해 <<. >> 연산자를 오버로드하라

*/

#include <iostream>

using namespace std;

 

class CppArray

{

private:

        float *arr;

        int len;

public:

        CppArray(int size = 10, float initvalue = 0.0):len(size) //(a)

        {

               arr = new float[len];

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

                       arr[i] = initvalue;

        }

        ~CppArray() //(d)

        {

               delete[]arr; //delete

        }

        CppArray(const CppArray &cp2) //(b)

        {

               len = cp2.len;

               arr = new float[len];

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

                       arr[i]=cp2.arr[i];

        }

        CppArray &operator=(const CppArray &cp2) //(c)

        {

               if (this != &cp2) //cp2와 동일한 배열이 아니라면 다시 설정해줘야함

               {

                       delete[]arr;

                       len = cp2.len;

                       arr = new float[len];

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

                              arr[i] = cp2.arr[i];

               }

               return *this;

        }

        float &operator[](int i) //[] 연산자 (e)

        {

               if (i >= 0 && i < len) //범위 체크

                       return arr[i];

               else

                       cout << "오류검출" << endl;

        }

        int GetSize() //(f)

        {

               return len;

        }

        friend ostream &operator<<(ostream &os, CppArray &cp2);

        friend istream &operator>>(istream &is, CppArray &cp2);

};

 

ostream &operator<<(ostream &os, CppArray &cp2)

{

        for (int i = 0; i < cp2.len; i++)

               os << cp2.arr[i] << " ";

        os << endl;

        return os;

}

 

istream &operator>>(istream &is, CppArray &cp2)

{

        cout << "배열의 크기 입력: ";

        is >> cp2.len;

        for (int i = 0; i < cp2.len; i++)

        {

               cout << i + 1 << "번째 칸 입력: ";

               is >> cp2.arr[i];

        }

        return is;

}

 

int main(void)

{

        CppArray cp1;

        cout << "cp1 배열 입력" << endl;

        cin >> cp1;

        cout << "cp1 배열 출력" << endl;

        cout << cp1;

 

        cout << endl << "cp2 cp1 복사" << endl;

        CppArray cp2 = cp1; //복사생성자

        cout << "cp2 배열 출력" << endl;

        cout << cp2;

        return 0;

}



반응형