CPP) 상속 Class 강의 준비

#include <iostream>
 
using namespace std;
 
class parent {
public :
    void print1() {
        cout << "parent print1" << "\n";
    }
    virtual void print2() {
        cout << "parent print2" << "\n";
    }
    virtual void print3() {
        cout << "parent print3" << "\n";
    }
};
 
class child : public parent {
public :
    void print2() {
        cout << "child print2" << "\n";
    }
    void print3(int x) {
        cout << "child print3" << "\n";
    }
};
 
int main() {
    parent* p;
    child c;
    p = &c;
 
    p->print1();
    p->print2();
    p->print3();    
 
    return 0;
}


virtual 함수를 사용 하기 위해서 메모리 할당을 통한 class 할당이 이루어져야한다.

출처: https://yeolco.tistory.com/125 [열코의 프로그래밍 일기]
#include <iostream> 
using namespace std; 

class Parent { 
  private: int num1;
  public: int num2;
  protected: int num3; 
}; 

class Base : private Parent { }; 

int main() { 
  Base base; 
  cout << base.num1 << endl; // error!
  cout << base.num2 << endl; // error! 
  cout << base.num3 << endl; // error! 
  return 0;
}


출처: https://blog.hexabrain.net/173 [끝나지 않는 프로그래밍 일기]
#include <iostream>
#include <fstream>

/**
 * 2개의 파일에 있는 내용을 합쳐서 1개의 파일에 넣어야 한다.
 * 먼저, ifstream , ofstream 을 사용해서 read, write 할 파일을 연결해주어야한다.
 * 또한, 2개의 파일에서 중복되는 문장이 있으면, 중복되는 문장 없이 파일을 합쳐서 작성 해줘야한다.
 * 저장될 파일은 output.txt 이고, 기반이 되는 파일 2개는 input1.txt input2.txt 이다.
 * -------------------------------------------------------------------------------
 * merge 함수는 합칠 파일 2개 (input 파일 2개)와 합쳐질 파일이 저장될 파일 (output 파일 1개)
 * 를 매개변수로 갖는다.
 * findSameLine 은 먼저 맨 처음 들어온 파일의 문장들과 2번 째 파일의 문장을 하나씩 비교해서, 같으면 true 를 반환하고
 * 다르면 false 를 반환하는 함수이다.
 * */

using namespace std;

/**
 * merge 함수는, ifstream 의 입력파일 2개, ofstream 의 출력파일 1개를 매개변수로 갖는다
 * 먼저 inputFileOne 의 모든 문장을 string 배열에 저장한다.
 * 그리고 inputFileTwo 의 문장을 저장 할 때마다 그 문장과 string 배열 에 저장된 문자열을 비교한다. (findSameLine 을 사용해서)
 * 비교한 문장이 다를 떄만, string 배열에 인덱스를 한개씩 추가해서 저장해준다.
 * 그리고 모든 input 파일을 읽는 것이 끝나게 되면, 반복문을 통해 string 배열에 있는 저장된 문자열을 output 파일에 출력(작성)한다.
 * */
void merge(ifstream& inputFileOne, ifstream& inputFileTwo, ofstream& outputFile);
/**
 * findSameLine 은, 현재 사용된 배열의 크기 (index) 와, 비교할 문자열, 문자배열을 매개변수로 받는다.
 * index 까지의 반복문을 통해서 문자열 배열 과 문자열을 비교해서 같으면 true 를 반환하고
 * 다르면 false 를 반환한다.
 * */
bool findSameLine(const int& index, const string& tempBuffer, const string* buffers);


/**
 * main 함수는 ifstream 형식의 파일을 2개와 ofstream 형식의 파일 1개를 정의한다.
 * inputFile 2개와 outputFile 이 모두 정상작동 할 때, (fail() 함수를 사용해서 오류가 나오면 프로그램을 종료시킨다)
 * merge 함수를 실행한다. merge 함수가 끝나면, close() 함수를 사용해서 ifstream, ofstream 의 파일 연결을 없애주고
 * 프로그램을 종료해준다.
 */
int main() {
    ifstream inputFileOne, inputFileTwo;

    // ifstream 형식으로 된 파일을 정의해준다. 파일 (input1.txt) 와 연결한다.
    inputFileOne.open("input1.txt");

    // inputFileOne 이 오류가 생기면, 프로그램을 종료해준다.
    if(inputFileOne.fail()) {
        cout << "input1 error" << endl;
        exit(1);
    }

    // ifstream 형식으로 된 파일을 정의해준다. 파일 (input2.txt) 와 연결한다.
    inputFileTwo.open("input2.txt");

    // inputFileTwo 이 오류가 생기면, 프로그램을 종료해준다.
    if(inputFileTwo.fail()) {
        cout << "input2 error" << endl;
        exit(1);
    }

    // ofstream 형식으로 된 파일을 정의해준다. 파일 (output.txt) 와 연결한다.
    ofstream outputFile("output.txt");

    // ofstream 이 오류가 생기면, 프로그램을 종료한다.
    if(inputFileTwo.fail()) {
        cout << "output error" << endl;
        exit(1);
    }

    // 합칠 파일 2개와 합쳐지고 난 후 결과물로 저장될 파일 1개를 매개변수로 넣어주고 merge 함수를 실행한다.
    merge(inputFileOne, inputFileTwo, outputFile);

    // merge 함수가 끝나고 난 후, 파일 연결을 종료시켜준다.
    inputFileOne.close();
    inputFileTwo.close();
    outputFile.close();

    return 0;
}

void merge(ifstream& inputFileOne, ifstream& inputFileTwo, ofstream& outputFile) {

    // 문자열 배열의 최대크기를 지정하는 정수형 상수이다. 현재는, 최대 50줄을 받을 것이다.
    const int SIZE = 50;

    // 문자열 배열의 동적 할당을 통해서 문자열 배열을 생성하였다.
    // string buffers[SIZE]; 와 같은 의미를 갖는다.
    string *buffers = new string[SIZE];

    // index 값은 사용될 문자열 배열의 크기 값을 나타낸다.
    int index = 0;

    // inputFileOne이 끝날때 까지 반복하는 함수이다.
    while(!inputFileOne.eof()) {
        // 공백까지 읽어들이기 위해서 getline() 함수를 사용하였다.
        // getline() 함수는 (stream, 저장될 변수 명) 의 매개변수 형식을 갖는다.
        getline(inputFileOne, buffers[index]);
        // 매개변수를 저장했으면, 사용될 문자열 배열의 크기를 1 증가시키낟.
        index++;
    }

    // 2번째 파일을 읽을 떄는, 이미 저장된 buffrs 의 각각의 값과 2번째 파일의 문장과 비교해서
    // 중복되는 표현이 있는지 확인해야한다. 따라서, string 값을 따로 사용한다.
    string tempBuffer;

    // 2번째 파일이 끝날때 까지 반복하는 함수이다.
    while(!inputFileTwo.eof()) {
        // tempBuffer 의 문자열을 저장한다.
        getline(inputFileTwo, tempBuffer);

        // 2번째 파일의 문장 1개가 저장된 값과 이미 있는 buffers 배열의 값 중에서 중복된 값이 있는지 비교한다.
        bool isSame = findSameLine(index, tempBuffer, buffers);
        // 중복된 표현이 아닐때만 문자열 배열에 저장해주고 index 값을 1 증가시켜준다.
        if (!isSame) {
            buffers[index] = tempBuffer;
            index++;
        }
    }

    // outputFile 에 출력(작성) 해준다.
    // 반복문을 통해서 사용된 값 index 만큼 반복하며,
    // outputFile 에 buffers 에 있는 값들을 하나씩 작성해주고,
    // 문장을 띄어서 작성해준다. (-> 1문장씩 저장을 했는데 그대로 출력해주면 붙혀서 1문장으로 나오기 때문에 "\n" 으로 띄워줘야한다)
    for(int i = 0; i < index; i++) {
         outputFile << buffers[i] << "\n";
    }

    // 배열을 동적할당 하였기 때문에 프로그램이 끝난 후에는, delete 로 동적할당된 메모리를 풀어줘야한다.
    delete [] buffers;
}


bool findSameLine(const int& index, const string& tempBuffer, const string* buffers) {

    // 배열에 쓰인 크기를 index 로 받아서 그만큼 반복하며 배열에 있는 값들과 현재 저장된 문자열을 비교한다
    for (int i = 0; i < index; i++) {
        if (buffers[i] == tempBuffer) {
            // 현재 저장된 문자열 값이 이미 저장된 문자열 배열에 있으면,
            // true 를 반환한다
            return true;
        }
    }
    // 저장된 값중에 현재 입력된 문자열과 다르다면 false 를 반환한다.
    return false;
}

좋은 웹페이지 즐겨찾기