내부에서 사용하는 객체에 대한 핸들을

반환하는 코드는 되도록 피하자.


사각형의 좌측 상단, 우측 하단의 꼭짓점을

추상화한 Rec 클래스가 있다.  꼭짓점을

Rec클래스에 넣지 않고 별도의 구조체에

넣은 후 Rec가 이 구조체를 가리키도록 만들었다.




class point{

int x,y;

...

};


struct RecData{

point ulhc;

point lrhc;

};


class Rec{

tr1::shared_ptr<RecData> pData;

...

};




Rec 클래스의 사용자는 꼭짓점의 정보를

얻을 수 있어야하므로 멤버함수를 정의한다.

class Rec{

public:

point& upper() const (return pData->ulhc;}

point& lower() const (return pData->lrhc;}

}




함수들이 모두 const로 선언되어 있으나

함수안에서 리턴되는 참조자에 의해

값이 변경될 수 있다. ulhc, lrhc는 Rec의

멤버가 아니기 때문에 충분히 가능하다.


1. 클래스 데이터 멤버는 아무리 숨겨봤자 그 멤버의

참조자를 반환하는 함수들의 최대 접근도에 따라

캡슐화 정도가 정해진다.


2. 어떤 객체에서 호출한 상수 멤버 함수의 참조자

반환 값의 실제 데이터가 그 객체의 바깥에 저장되어 있다면

이 함수의 호출부에서 그 데이터의 수정이 가능하다.




참조자 뿐만 아니라 포인터, 반복자는 모두 핸들이다.

외부 공개가 차단된 멤버 변수 뿐만 아니라 멤버 함수에

대해서도 이들의 핸들을 반환하는 멤버 함수를 만들지 않아야 한다.


const point& upper() const (return pData->ulhc;}

const point& lower() const (return pData->lrhc;}

위의 문제는 이와 같이 const를 붙여주면 해결된다.




무효참조 핸들

객체를 참조자로 반환 했을 때

그 객체가 함수 내에서 선언된

지역 객체라면 함수가 종료됨과 동시에

없어지게 된다. 따라서 반환값을 받는

변수는 없어진 객체를 받게 된다.


핸들을 반환하는 것은 const를 붙였다해도

바깥으로 떨어져 나간 핸들은 그 핸들이 참조하는

객체보다 오래 살 위험이 있다. 따라서 핸들을

리턴하는 것은 되도록이면 피하도록 하자.




POINT!!

어떤 객체의 내부요소에 대한 해들을 반환하는 것은 되도록 피하자.

여러가지 1 문제 빙고 (정올)


간단한 문제인 줄 알았지만, 상당히 코드가 길다.

내가 좀 비효율적으로 푼 것 같기도 하다..






가로, 세로, 크로스로 체크하는 함수를

따로 두어서 그 함수에서 체크된 빙고 수를 리턴



입력, 출력 등등 여러가지


알고리즘을 풀기 전에 기초부터 제대로 잡고 들어가야 할 것 같다.

그리고 코딩 테스트에서 알고리즘보다 이러한 문제 풀이형식의

문제가 더욱 많이 출제 되는 것 같다. 분발하자.


문자열 관련 문제 02 (정올)

비밀 편지, 단어 집합(하), 소수문자열, 단어세기




01. 비밀 편지






02. 단어 집함(하)




03. 소수 문자열

소수를 체크하는 부분에서 좀 더 효율적인 코드를 생각해보자.



04. 단어 세기

경고가 뜨는 이유에 대해서 좀 더 생각해보자.




+ Recent posts