2011-10-21 4 views
1

저는 자체 Windows API 래퍼를 시작하고 C++ 기능을 포함하도록 구조를 다시 작성하는 동안 익숙하지 않은 주제로 실행했습니다.어디서나 데이터 멤버에 액세스 할 수 있지만 읽기 전용

나는이를 돌리겠다 :

typedef struct _RECT { 
    LONG left; 
    LONG top; 
    LONG right; 
    LONG bottom; 
} RECT, *PRECT; 

#define RECT_POS 1 
#define RECT_SIZE 2 

typedef struct WrapperRect // RECT 
{ 
    WrapperRect(); // all 0 
    WrapperRect (const double, const double, const double, const double, bool = RECT_POS); // initalize with tl pos and either br pos or size 

    bool set (const double, const double, const double, const double, bool = RECT_POS); // set tl pos and either br pos or size 
    bool pos (const double, const double); // set tl pos 
    bool size (const double, const double); // set size 

    WrapperRect & operator= (const WrapperRect &); // assign another rect 
    bool operator== (const WrapperRect &); // check for equality (pos+size) 
    bool operator!= (const WrapperRect &); // check for inequality (pos+size) 
    bool operator> (const WrapperRect &); // check for tl pos greater 
    bool operator< (const WrapperRect &); // check for tl pos less 
    bool operator>= (const WrapperRect &); // check for tl pos greater equal 
    bool operator<= (const WrapperRect &); // check for tl pos less equal 
    WrapperRect & operator+ (const POINT &); // move down/right 
    WrapperRect & operator- (const POINT &); // move up/left 
    WrapperRect & operator+= (const POINT &); // move down/right 
    WrapperRect & operator-= (const POINT &); // move up/left 

    double l, left, x; // left 
    double r, right; // right 
    double t, top, y; // top 
    double b, bottom; // bottom 

    double w, width; // width 
    double h, height; // height 
} Rect, rect; // allow more convenient names 

에 내 유일한 문제는 사용자가 있다면

Rect myRect; 
myRect.right = 50; 

그것이 오른쪽을 설정합니다 말을한다는 것입니다, 그러나 오른쪽 또는 너비에 대한 별칭을 변경할 수는 없습니다.

나는 회원은 개인되고 싶지 않아 중 하나를 나는 귀찮은

cout << myRect.getX(); 

구문보다는

cout << myRect.x; 

구문을 원하기 때문에.
이를 수행 할 방법이 없나요? 아니면 get 함수를 사용해야합니까?

편집 :
필자는이 글을 쓸 때 실제로 생각하지 못했던 몇 가지 반환 값 (>.>)을 추가하고 연산자 + 등의 이중을 한 점으로 변경했습니다. 나는 하나를 받아들이 기 전에 가능성을 시험하기 시작했습니다.

답변

1

데이터 멤버를 공개하는 것은 매우 나쁜 습관입니다. 또한 수업 내에서 똑같은 정보를 여러 개 복사하는 것은 매우 나쁜 습관입니다. 비효율적이며 버그가 발생하기 쉽습니다.

확실히 접근 자 기능을 사용해야합니다.

즉, getX()가 필요하지 않습니다. - 그냥 x() 괜찮을거야.당신은 여전히 ​​다소 구현을 노출 되더라도

struct Rect 
{ 
private: 
    double l, r, t, b; 

public: 
    const double &x, &y; 

    Rect() : x(r), y(t) {} 

    ...etc. 
}; 

이 그럼 당신은 안전한 방식으로 r.x를 사용할 수 있습니다 : 당신이 정말 함수 구문을 피하는 설정하는 경우

, 이런 걸 내가 생각 확인이 될 것입니다 .

+0

정의 문에서 어리석은 오류가 나온 후 마침내 컴파일되고 작동합니다. 여기에있는 나쁜 습관에 대해 걱정하지 마십시오. 난 단지 내 작은 프로그램 개발을 위해 그것을 사용하고 있습니다. – chris

+0

노출 된 const 참조를 const_cast로 읽기 - 쓰기 가능하게 만들 수 있습니다. – jvstech

+0

또한 'const volatile'이어야한다는 점에 유의할 가치가 있습니다. 휘발성이 없으면 컴파일러는 역순으로 논리적으로 나타나는 다른 write-of-r보다 먼저 "x of read"를 이동할 수 있습니다. – Daniel

0

get 함수를 사용해야합니다. 자신이 원하는 구문을 원하지 않습니다.

예를 들어 나중에 x 및 y 값을 모두 일부 복잡한 구조로 인코딩하도록 함수를 변경한다고 가정합니다. 그러면 myRect.x은 어떻게 작동합니까?

x의 값을 검색하는 것은 거의 없습니다. 그렇게하지 않으면 계산할 필요가 없습니다. 그러면 myRect.x은 어떻게 작동합니까?

미래에 어느 시점에 말하면, x에 액세스 한 횟수를 계산해야합니다. 그러면 myRec.x을 어떻게 작동하게 할 것입니까?

get 함수를 사용하여 x 값을 가져 오려는 코드에 강제로 클래스 내부에 저장되는 방식을 이해하도록하지 마십시오.

0

상수 포인터를 사용할 수 있습니다. const double * xPtr; 다음 생성자에서 초기화 : xPtr = &xx을 수정하는 데 사용할 수없는 x에 대한 포인터를 만듭니다. x 값을 변경하려면 설정 기 기능이 필요합니다. 언급 한 바와 같이

,이 나쁜 관행이며, 당신은 개인 회원 접근을 가진 클래스를 사용하는 것이 더 낫다 등

const 포인터 타입은 여기 참조 :

http://www.codeguru.com/cpp/cpp/cpp_mfc/general/article.php/c6967

0

이를 나에게 많은 코딩 크레딧을 적립하지 못할 수도 있지만 실제로는 그게 라고 생각하지 않는다. 나쁜 스타일은 멤버를 직접 액세스 할 때 직접적으로 데이터를 저장할 책임이있는 구조체와 매우 흡사하다. 더 높은 지능 수준. 그래서 귀하의 질문에 대한 대답은이 작업을 수행 할 때, 다음 시간에 액세스하고 높이를 액세스 실제로 메모리에 같은 위치에 액세스 노동 조합

struct rect 
{ 
    union 
    { 
     double width; 
     double w; 
    }; 

    union 
    { 
     double height; 
     double h; 
    }; 
} 

을 사용하는 것입니다.

관련 문제