2010년 6월 25일 금요일

Simple Singleton Example


From : http://sourcemaking.com/design_patterns/singleton/cpp/1

class GlobalClass

{

...
static GlobalClass *instance()

{

if (!s_instance)

s_instance = new GlobalClass;

return s_instance;

}
...

};

// Allocating and initializing GlobalClass's

// static data member. The pointer is being

// allocated - not the object inself.

GlobalClass *GlobalClass::s_instance = 0;


void foo(void)

{

GlobalClass::instance()->set_value(1);

cout << "foo: global_ptr is " << GlobalClass::instance()->get_value() << '\n';

}
  
 위에서 보는 것처럼 단지 공유 객체 포인터를 static으로만 선언하는 것만으로는불 충분하다. 좀 괜찮게 보일 될려면 GlobalClass::instance() 이렇게 한 꺼풀더 씌우자
From : http://sourcemaking.com/design_patterns/singleton/cpp/1

2010년 6월 23일 수요일

습관을 고치자 – in programming

초기의 간단한 구조에서는 그닥 class diagram이 필요가 없지만

깔끔하게 design pattern 등도 고려가 되어서 잘 구조가 된다.

그렇지만 어느 순간 덧붙이다 보면

class 간 partition이 제대로 이루어 지지 않는다.

이 이유 중 하나가 새로운 기능 추가 시 기존의 class diagram을 보지 않고

보이는 데로 추가를 하기 때문에 발생한다.

2010년 6월 22일 화요일

간단하지만 헷갈리는 virtual destructor

이 자료는 http://glotalk.egloos.com/2018168 에서 퍼옴을 밝힙니다.

#include "stdafx.h"
struct A1      { virtual ~A1() { printf("A1 dtor\n"); } };
struct A2 : A1 { virtual ~A2() { printf("A2 dtor\n"); } };
struct A3 : A2 { virtual ~A3() { printf("A3 dtor\n"); } };
struct B1      { ~B1() { printf("B1 dtor\n"); } };
struct B2 : B1 { ~B2() { printf("B2 dtor\n"); } };
struct B3 : B2 { ~B3() { printf("B3 dtor\n"); } };
int _tmain(int argc, _TCHAR* argv[])
{
    A1 * a = new A3;
    delete a;
    printf("\n");

    A3 * a2 = new A3;
    delete a2;
    printf("\n");

    B1 * b = new B3;
    delete b;
    printf("\n");

    B3 * b2 = new B3;
    delete b2;
    printf("\n");

    return 0;
}


 

출력은

A3 dtor
A2 dtor
A1 dtor

A3 dtor
A2 dtor
A1 dtor

B1 dtor

B3 dtor
B2 dtor
B1 dtor

2010년 6월 20일 일요일

C++ 다중 상속의 개념

class간 결합을 interface로 따로 분리됨으로써 class 간 복잡도, 결합도가 떨어진다.


 

interface는C++ 에서는 class로 표현, JAVA에서는 interface keyword로 표현


 

C++ 에서 보통 interface를 virtual 로 정의하고 구현은 뒤로 미루는데 이것이 interface정의의 원칙이란다.


 

Java에서는 interface에서 class에서 정의된 함수들을 그냥 쓰면 되지만

C++ 에서는 interface의 함수들을 이용하기 위해서는 그 interface를 정의된 class의 상속을 통해서

이용이 가능하다. 따라서 다른 class에서 정의된 interface를 사용하기 위해서는 서로 다른 class를 상속

하는 길 밖에는 없다.

  • 패턴 그리고 객체지향적 코딩의 법칙 story 3 일부분에서

2010년 6월 11일 금요일

헷갈리는 const 용법 ( in Effective C++ )

전통적 Const 용법

Const char *p = greeting

비상수 포인터 , 비상수 데이터

Char * const p = greeting

상수 포인터 , 비상수 데이터


 

class에서 const

class TextBlock {

    public :

    ...

     const char & operator [] const ( std::size_t position ) const { return text[ position ] ; } // 상수 객체에 대한

     const char & operator [] ( std::size_t position ) const { return text[ position ] ; }         // 비상수 객체에 대한

    ...

}

    

비상수 멤버 호출

상수 멤버 호출

TextBlock tb("hello");

std::cout<< tb[0];

const TextBlock tb("hello");

std::cout<< tb[0];


 

여기서 파생되는 유의점

std:;size_t CTexxtBock::length () const

{    

    // 내부에서 class 변수들을 수정한다면 error

    // 왜냐하면 여기서 변수를 수정한다면 상수 멤버를 호출한 것에 대한 것과 모순이 발생

}