WinAPI UI (5) ❗

CJB_ny·2022년 9월 29일
0

WinAPI

목록 보기
52/79
post-thumbnail

오늘 배운거 👍👍👍

  • UI 클래스 객체 생성 방지를 위한 순수가상함수 구현 X

  • 순수 가상함수를 삭제할 때 ❗


    현재는 public으로 여니까


    이부분에서 컴파일 에러가 안뜨는데, = 0; 으로 삭제시킨 함수가 private에 있을 경우 컴파일 에라가 난다.

  • 순수가상함수 선언 방법과 함수 삭제하는 부분을 햇갈림 ❗❗❗

    virtual void Test() = 0; == Test() = 0; 이게 순수 가상함수 문법인데

    virtual void Test() = 0; 지금 이것을 Test() = delete;랑 햇갈림

    = delete는 함수를 아예 사용을 못하게 막는 것이라서

    지금 이부분을 햇가렸던 것이다. delete하면은 UI를 상속받는 애들은 CLONE메크로를 구현하지 못한다.

  • 다형성 문제 ❗❗❗❗❗

    명시적, 암시적 복사생성자의 호출 순서 및 문법, 개념


이해 안가는 부분

  • 함수 삭제

    = delete는 컴파일 에러가 나고 = 0; 은 컴파일 에러가 안나는데... ㅇ이유가..???


부모 UI들 중에서 누가 포커싱이 되어 있는지 찾을 것이다.

Panel, button구현하고

PanelUI만 클릭하고 드래그 기능을 만들 것이다.

마우스를 클릭한 순간의 좌표를 기억을 해준다.

그리고 해당 차이값만큼

UI도 똑같이 이동시켜주면 된다.

왼쪽에는 UI에서 LbtnDown 값 반환하는 함수랑

오른쪽은 PanelUI스크립트인데 MouseOn인 상태에서 IsLbtnDown이라는 것은

'드래그' 상태이다.

그래서 update에서 MOUSE_POS 가지고온다음에 MouseLbtnDown의 MOUSe_POS랑 차이값을 구하면 그게 드래그해서 나온 차이값이 될것이다.

이 거리만큼.

주의 ❗

31번째 줄에 눌렀을 때 마우스 좌표를 MOUsePOS로 갱신 해주어야한다.

안해주면 처음 누른 좌표에서부터 diff 값만큼 계속 이동할 것이다.( lbtn누르고 있는 상태라면은)


자식 UI는 부모가 움직이면 따라오는데

내현재(자식) 좌표에서 부모의 _finalPos를 구한다음에 자신의 좌표를 더해서 현재 좌표를

finalUpdate에서 구하고있기 때문에...

Shollow Copy, Deep Copy ❗❗❗

이런 드래그가 가능한 UI가 여러개 있어야 하지않나?

복사를 떠서 추가해주면 될까??

지금 UI쪽은 복사생성자를 따로 구현을 내가 해놓지 않아서

'깊은 복사'가 안 일어나고 '얕은 복사'가 일어난다.

=>

지금 이 부분이 얕은복사로 복사가 되니까 같은 주소를 공유하게 된다.

그르면 드래그하면은 다같이 움직이겠네?

우리는 형태만 복사되기를 원한다.

이까지는 문제가없는데 _vecChildUI가 문제이다.

UI 복사생성자 코드 분석 ❗

origin의 모든 자식들을 AddChild를 해주는데 Clone을 호출해서 추가를 해준다.

CLONE 메크로가 새로운 객체를 동적할당해서 반환을 함.

그러면 CLONE의 *this로 들어가는 녀석이 _vecChild[i]녀석이고 이녀석을

얕은 복사로 안에 내용물들을 다 복사받은(얕은 복사로 scale, pos등) 동적할당으로 새로운 주소를 가지는 객체를

AddChild하게 되는 것이다.

지금 문제가 되는게 테스트를 할려고 순수 가상함수인 CLONE을 최상위 부모 클래스에다가

구현을 해놓아서 Clone호출 하더라도 부모가 복사가 됨.

그래서 우리는 애초에 UI라는 클래스를 객체를 못만들게 하려고 했으니까 순수가상함수를 UI에서는 없애고 UI상속 받는 클래스에다 구현을 해주도록 하자.

그러면 UI는 클래스들은 복사생성자 따로구현해서 깊은 복사를 진행할 필요가 없다.

그냥 얕은 복사(기본 복사 생성자)를 호출하면은 된다.

부모 == UI클래스에서 복사생성자(깊은복사)를 구현을 해놓았다.

아까 상황 설명 ❗

아까 UI 클래스에다가 순수가상 함수 CLONE이 구현되어 있는 상황에서는

딱 순수가상함수를 구현해놓은 UI까지만이 복사가 되었던 상황이다.

Object, UI 클래슨 깊은 복사가 필요하기 때문에 각자 다 깊은 복사를 구현을 해놓았다.

panelUI같은 경우는 얕은 복사를 해도 상관이 없다 (지금은)

현재 CLONE으로 복사받은 UI가 부모의 생성자를 타고타고 가는데 결국에는 Object클래스의 기본생상자를 호출하게 되어서 scale이 0, 0이 나오게 되어서 화면에 안나오고 있다.

복사 생성자 호출 순서 파악 ❗❗❗❗❗

위의 문제는 현재 생성자, 복사 생성자 관련 문제이다.

https://velog.io/@starkshn/%EC%83%9D%EC%84%B1%EC%9E%90%EC%99%80-%EC%86%8C%EB%A9%B8%EC%9E%90

기본적으로 복사생성자, 기본 생성자는 implicit 암시적으로 만들어진다.

Explici로 생성자를 만든다면은 '기본생성자'는 만들어지지 않는다.

(추가적으로 '타입 변환 생성자'도 알아 두어라...)

이 부분을 이해를 하려면 생성자 동작 방식을 '정확히' 알고 있어야한다.

동적 바인딩 ❗❗❗

https://velog.io/@starkshn/%EB%8B%A4%ED%98%95%EC%84%B1-1-2

결론적으로

https://velog.io/@starkshn/%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC-vs-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC-1-2

이부분을 보면은 된다.

수정 && 이유 ❗❗❗

현재 PanelUI스크립트에서 UI 클래스까지 명시적 복사생성자는 호출을 잘했다.

그런데, 여기서 문제가 발생하는데

명시적으로 '복사 생성자'를 구현해줄 경우 부모 클랫의 기본생성자가 호출이 된다.

(그냥 문법이 그렇다) => 내가 명시적으로 복사 생성자를 만들었기 때문에

컴파일러가 이제는 "아 니가 명시적으로 구현했으니 이제 니가 다 알아서 구현을 해~" 느낌이다.

그래서 UI 클래스의 명시적 복사생성자를 호출하고 UI의 부모 클래스의 기본생성자를 호출 하고 싶지 않다면은 이것 또한

'명시적'으로

이렇게 호출 해주어야한다.

(강사님이 좀 햇갈리신듯...)

이렇게 다시 수정 해주도록 하자.

암시적 복사생성자들이 부모쪽의 복사생성자를 호출 해준다.

궁금한점❗❗

Parent, child 상속관계 일 때

Parent에는 복사생성자를 명시적으로 구현을 하고 child에는 명시적으로 구현하지 않았을 때,

child의 암시적 복사 생성자를 호출 할 경우 Parent의 명시적 복사 생성자가 호출이 되나?

class Parent
{
public:
	Parent() { cout << "Parent()" << endl; };

	Parent(const Parent& p) { cout << "Parent(const Parent& p)" << endl; };
};

class Child : public Parent
{
public:
	Child() {}

};


int main()
{
	Child c1;

	Child c2(c1);

	int a = 10;

	return 0;
}

현재 c1은 부모의 기본생성자를 호출 했고

c2는 Child c2(c1);문법을 통해 암시적 복사 생성자를 호출 했는데

부모에 명시적으로 구현을 해놓은 복사생성자가 호출이 되는 것을 확인이 가능하다.

원래 문법이 암시적 복사 생성자를 호출 하면 부모의 복사생성자를 호출 한다고 했으니까...


현재 다른 오브젝트들은 default 복사 생성자를 사용중이라 문제가 없다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글