//

//  main.cpp

//  ExampleCpp

//

//  Created by 김일호 on 2015. 7. 10..

//  Copyright (c) 2015 김일호. All rights reserved.



//  클래스 템플릿 사용 전 각 자료형에 맞는 클래스를 생성


#include <iostream>

#include <string>

using namespace std;


class IntArray

{

    int *buf;

    int size;

    int capacity;

    

public:

    explicit IntArray(int cap = 100):buf(0), size(0), capacity(cap)

    {

        buf = new int[capacity];

    }

    

    ~IntArray() { delete[] buf;}

    

    void Add(int data)

    {

        buf[size++] = data;

    }

    

    int operator[](int idx) const

    {

        return buf[idx];

    }

    

    int GetSize() const

    {

        return size;

    }

};


class DoubleArray

{

    double *buf;

    int size;

    int capacity;

public:

    explicit DoubleArray(int cap=100):buf(0), size(0), capacity(cap)

    {

        buf = new double[capacity];

    }

    ~DoubleArray() {delete[] buf;}

    

    void Add(double data)

    {

        buf[size++] = data;

    }

    

    double operator[] (int idx) const

    {

        return buf[idx];

    }

    

    int GetSize() const {return size;}

};


class StringArray

{

    string *buf;

    int size;

    int capacity;

public:

    

    explicit StringArray(int cap = 100):buf(0), size(0), capacity(cap)

    {

        buf = new string[capacity];

    }

    void Add(string data)

    {

        buf[size++] = data;

    }

    

    string operator[] (int idx) const

    {

        return buf[idx];

    }

    

    int GetSize() const {return size;}

};


int main()

{

    IntArray iarr;

    

    iarr.Add(10);

    iarr.Add(20);

    iarr.Add(30);

    

    for (int i = 0; i<iarr.GetSize(); ++i)

    {

        cout << iarr[i] << endl;

    }

    

    DoubleArray darr;

    

    darr.Add(10.12);

    darr.Add(20.12);

    darr.Add(30.12);

    

    for (int i = 0; i<darr.GetSize(); ++i)

    {

        cout << darr[i] << endl;

    }

    

    StringArray sarr;

    

    sarr.Add("abc");

    sarr.Add("ABC");

    sarr.Add("sdfads");

    

    for (int i = 0; i<sarr.GetSize(); ++i)

    {

        cout << sarr[i] << endl;

    }

    

    

    return 0;

}


//클래스 템플릿 버전


//

//  main.cpp

//  ExampleCpp

//

//  Created by 김일호 on 2015. 7. 10..

//  Copyright (c) 2015 김일호. All rights reserved.

//


#include <iostream>

#include <string>

using namespace std;


template<typename T>

class Array

{

    T *buf;

    int size;

    int capacity;

    

public:

    explicit Array(int cap = 100):buf(0), size(0), capacity(cap)

    {

        buf = new T[capacity];

    }

    

    ~Array() { delete[] buf;}

    

    void Add(T data)

    {

        buf[size++] = data;

    }

    

    T operator[](int idx) const

    {

        return buf[idx];

    }

    

    int GetSize() const

    {

        return size;

    }

};



int main()

{

    Array<int> iarr;

    

    iarr.Add(10);

    iarr.Add(20);

    iarr.Add(30);

    

    for (int i = 0; i<iarr.GetSize(); ++i)

    {

        cout << iarr[i] << endl;

    }

    

    Array<double> darr;

    

    darr.Add(10.12);

    darr.Add(20.12);

    darr.Add(30.12);

    

    for (int i = 0; i<darr.GetSize(); ++i)

    {

        cout << darr[i] << endl;

    }

    

    Array<string> sarr;

    

    sarr.Add("abc");

    sarr.Add("ABC");

    sarr.Add("sdfads");

    

    for (int i = 0; i<sarr.GetSize(); ++i)

    {

        cout << sarr[i] << endl;

    }

    

    

    return 0;

}


클래스를 템플릿화 시키면서 클라이언트에서는 자료형에 상관없이 클래스에 사용될 타입을 정의할 수 있다.

'Programing > C++' 카테고리의 다른 글

ReverseString  (0) 2015.12.02
두 정수가 같으면 true 다르면 false를 리턴하는 Equal 클래스  (0) 2015.09.04
함수 객체  (0) 2015.09.04
멤버 함수 포인터 선언  (0) 2015.09.04
형변환 연산자 오버로딩  (0) 2015.09.04
Posted by kimmayer

#include <iostream>

#include <algorithm>

using namespace std;


/**********************/

/*

class Equal {

int x, y;

public :

Equal() {}

Equal(int x, int y) { x = this->x; y = this->y; }

~Equal() {}

bool cmp_func()

{

return x == y  ? true : false;

}

};


int main()

{

Equal cmp(2, 2);

cout << cmp.cmp_func() << endl;

return 0;

}

*/ 

/******* 함수 객체 사용 ***************/ 

class Equal {

int x, y;

public:

Equal() {}

~Equal() {}

bool operator() (int x, int y)

{

return x == y ? true : false;

}

};


int main()

{

Equal cmp;

if (cmp(2, 2))

{

cout << "같다" << endl;

}

else

{

cout << "다르다" << endl;

}


return 0;

}

'Programing > C++' 카테고리의 다른 글

ReverseString  (0) 2015.12.02
클래스 템플릿 비교  (0) 2015.09.04
함수 객체  (0) 2015.09.04
멤버 함수 포인터 선언  (0) 2015.09.04
형변환 연산자 오버로딩  (0) 2015.09.04
Posted by kimmayer

2015. 9. 4. 11:23 Programing/C++

함수 객체

함수 객체는 함수처럼 동작하는 객체, 함수처럼 동작하려면 객체가 '()' 연산자를 정의해야 한다.

즉 () 연산자를 오버로딩한 객체가 함수 객체


#include <iostream>

#include <algorithm>

using namespace std;


struct Functor1 {

void operator() (int n)

{

cout << n << " ";

}

};

struct Functor2 {

void operator() (int n)

{

cout << n*n << " ";

}

};

struct Functor3 {

void operator() (int n)

{

cout << "정수 : " << n << endl;

}

};


int main()

{

int arr[5] = { 10,20,30,40,50 };


for_each(arr, arr + 5, Functor1());

cout << endl << endl;

for_each(arr, arr + 5, Functor2());

cout << endl << endl;

for_each(arr, arr + 5, Functor3());


return 0;

}

Posted by kimmayer

함수 포인터는 함수의 시작 주소를 저장하는 포인터

함수의 이름은 함수가 시작하는 시작 주소를 나타내며 함수 포인터는 이 함수의 주소를 저장하는 포인터!


#include <iostream>

#include <cstring>

using namespace std;


class Point

{

int x;

int y;

public:

explicit Point(int _x = 0, int _y = 0) :x(_x), y(_y) {}

void Print() const { cout << x << ", " << y << endl; }

void PrintInt(int n) { cout << "테스트정수: "<< n << endl; }

};


int main()

{

Point pt(2, 3);

Point *p = &pt;


void (Point::*pf1)() const; //멤버 함수 포인터 선언

pf1 = &Point::Print;


void(Point::*pf2)(int); //멤버 함수 포인터 선언

pf2 = &Point::PrintInt;


pt.Print();

pt.PrintInt(10);

cout << endl;


(pt.*pf1)();

(pt.*pf2)(10);

cout << endl;


(p->*pf1)();

(p->*pf2)(10);


return 0;

}

'Programing > C++' 카테고리의 다른 글

두 정수가 같으면 true 다르면 false를 리턴하는 Equal 클래스  (0) 2015.09.04
함수 객체  (0) 2015.09.04
형변환 연산자 오버로딩  (0) 2015.09.04
-> , * 연산자 오버로딩  (0) 2015.09.02
간단한 오버라이딩  (0) 2015.09.02
Posted by kimmayer

#include <iostream>

#include <cstring>

using namespace std;


class String {

char buf[1000];

public:

String(const char* sz) 

{

strcpy(buf, sz);

}

~String() {}


operator const char* () const 

{

return buf;

}

};


int main()

{

String s("Hello");

const char* sz = s;


cout << sz << endl;

}



operator const char* () const
{
 return buf;
}

형변환 연산자 오버로딩

return buf; 이므로 String 클래스 안에 있는 맴버 buf를 return


형변환 연산자 오버로딩은 

operator 타입명 () const

으로 원형을 정의한다.



'Programing > C++' 카테고리의 다른 글

함수 객체  (0) 2015.09.04
멤버 함수 포인터 선언  (0) 2015.09.04
-> , * 연산자 오버로딩  (0) 2015.09.02
간단한 오버라이딩  (0) 2015.09.02
구조체로 구현한 Invader  (0) 2015.06.09
Posted by kimmayer
이전버튼 1 이전버튼

블로그 이미지
IT 기술들 정리, 독후감을 주로 남깁니다!
kimmayer

공지사항

Yesterday
Today
Total

달력

 « |  » 2015.9
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함