4월, 2023의 게시물 표시
{{ label!='' ? 'Label : ' : (q!='' ? '검색 : ' : '전체 게시글') }} {{ label }} {{ q }} {{ ('('+(pubs|date:'yyyy-MM')+')') }}

[C++] 스터디 CPPALOM 16주차: Effective C++ Item 46~53

파워 포인트 파일(.pptx)을 Markdown으로 변환하여 업로드하였음) # <br>CPPALOM # <br>16주차 – Effective C++ item 46~53 한수빈 # <br>항목46: 타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자 * 템플릿 코드는 암시적 타입 변환을 고려해 정적 코드를 생성하지 않는다. * 다음 코드는 컴파일 에러를 일으킨다! * int형 2가 Rational 자료형으로 암시적 변환될 수 없기 때문이다. ```C++ template<typename T> class Rational { public: Rational(const T& numerator = 0, const T& denominator = 1); const T numerator() const; const T denominator() const; }; template<typename T> const Rational<T> operator*( const Rational<T>& lhs, const Rational<T>& rhs); Rational<int> oneHalf(1, 2); Rational<int> result = oneHalf * 2; ``` * 대신, 클래스 템플릿 안에 프렌드를 이용해서 선언하면, 프렌드 함수의 선언은 템플릿의 인자추론에 영향을 받지 않는다. * 선언 자체는 일반적인 함수가 되는 것과 마찬가지이다! * 하지만 이는 링크가 되지 않는다. * 클래스 자체는 선언되었으며, friend 멤버 함수는 non-template 함수로 컴파일된다. * 하지만 링커는 non-template 함수를 찾을 수 없다. template 함수만 존재하기 때문이다! ```C++ template<typename T> cla

[Troubleshooting] DirectX12 Resoucre 소멸 시 오류

설명   리소스 소멸 시 하드웨어 측에서 예상할 수 없는 행위를 함.    다음은 에러 로그의 일부임: D3D12 ERROR: ID3D12CommandList::Close: An ID3D12Resource object (0x000001EB6DBDFF70:'Unnamed Object'), referenced in the command list being closed (0x000001EB6DAAEED0:'Unnamed ID3D12GraphicsCommandList Object'), was deleted prior to closing the command list.  This is invalid and can result in application instability. [ EXECUTION ERROR #921: OBJECT_DELETED_WHILE_STILL_IN_USE] 원인   Commnad List를 통해 Resource를 생성하고 빠른 시간 안에 소멸시키는 경우, 명령이 제출되면서 GPU에서 해당 Resource에 대한 작업을 하지만 해당 Resouce는 소멸된 것이기 때문에 비정상적인 작업을 수행함. 해결   생성과 소멸 시기를 적절히 조절하여 해결할 수 있었음: Fence 값을 이용한 동기화

[C++] 스터디 CPPALOM 15주차: Effective C++ Item 36~45

파워 포인트 파일(.pptx)을 Markdown으로 변환하여 업로드하였음) # <br>CPPALOM # <br>15주차 – Effective C++ item 36~45 한수빈 # <br>항목36: 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물! * 비가상 함수는 정적으로 바인딩된다. * 다음 코드는 같은 이름임에도 불구하고 다른 함수가 호출된다! * 비가상 함수를 오버라이딩하는 것은 객체지향적으로 적절하지도 않으며, 오류가 날 여지가 많다! * 따라서 상속받은 비가상 함수를 재정의하는 일은 절대로 없도록 하자. ```C++ class D : public B { public: void mf(); ... }; pB->mf(); pD->mf(); ``` # <br>항목37: 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 * 다음 코드는 문제의 여지가 많다! * 어떤 타입의 포인터인지에 따라서 기본 매개변수의 값이 변하게 된다. * 따라서 상속받은 기본 매개변수 값은 절대로 재정의해서는 안 된다. * 기본 매개변수 값은 정적으로 바인딩되기 때문이다. ```C++ class Shape { public: enum ShapeColor { Red, Green, Blue }; virtual void draw(ShapeColor color = Red) const = 0; }; class Rectangle : public Shape { public: virtual void draw(ShapeColor color = Green) const; }; Shape* pr = new Rectangle(); pr->draw() // Calls Rectangle::draw(Shape::Red)! ``` * 기본 매개변수가 있는 가상 함수를 만드는 방법? * NVI 관용구 ```C++ class Shape { pu