전체 글 71

Main Parameter

#include int main() { std::cout 일반 에 보면 출력 디렉터리가 있다. 보면은 $(SolutionDir)$(Configuration)\ 이렇게 설정이 되어있는데 (SolutionDir)는 프로젝트가 있는 폴더까지의 경로를 매크로로 치환해둔것이다. 저걸 다 지우고 자신이 원하는 이름을 적으면 프로젝트를 기준으로 거기에 자신이 적은 이름으로 폴더가 생기고 거기에 파일들이 생성된다. #include int main(int _Count, char** _Data) { std::cout

WinAPI 2021.01.08

API 기본구조 살펴보기 1 , 복습

Windows 데스크톱 애플리케이션으로 프로젝트를 생성하면 기본적으로 제공되어 생성되어있는 코드들이 있다. F5로 실행해보면 윈도우창 하나가 뜬다. 기본적으로 마이크로소프에서 윈도우에서 C++ 프로그램을 만들기위한 윈도우창 하나를 만들어준거라고 볼 수 있다. 그러면 마이크로소프에서 프로그래머를 위해 어떤거를 제공했는지를 파악해보자. 기본적으로 디버깅(F10 실행)을 해보면서 시작부터 차근차근 하나씩 알아볼 수 있다. #define MAX_LOADSTRING 100 // 전역 변수: HINSTANCE hInst; // 현재 인스턴스입니다. WCHAR szTitle[MAX_LOADSTRING]; // 제목 표시줄 텍스트입니다. WCHAR szWindowClass[MAX_LOADSTRING]; // 기본 창 ..

WinAPI 2021.01.08

Friend 문법

friend 문법은 객체지향에 예외를 두는 문법이다. 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법 class Item { }; class Smith { }; 모든 아이템은 무조건 Smith에서 만들어져야 한다고 가정하면 Item 클래스는 절대로 객체화가 되면 안된다.Smith에서만 생성되어야 한다. class Item { private: Item() { } }; 그러면 이렇게 해주면 외부에서 만들 수(객체화) 없다. 그리고 역시나 Smith 클래스에서도 사용이 불가능하다. class Smith { public: Item* CreateItem() { return new Item(); } }; 상단의 조건..

C++ 2021.01.06

vector와 list

vector 배열과 비슷한 구조로 메모리에 연속적으로 저장되며 배열과는 다르게 동적으로 할당하기 때문에 공간의 확장,축소가 가능하다. 그치만 공간의 확장,축소시에 기존 데이터를 복사하고 삭제후에 공간의 크기를 확장,축소하고 복사해둔 기존데이터를 붙여넣기하는 작업을 거치기때문에 비용이 크다.그렇기 때문에 reserve 함수를 이용해서 미리 공간의 크기를 정해놓고 사용하는것이 좋다. 중간 삽입,삭제가 어렵다.중간에 데이터를 추가하면 vector는 메모리가 연속적으로 저장되어있기 때문에 추가할 데이터의 위치에있던 데이터부터 모두 한칸씩 뒤로 밀어줘야한다.삭제 역시 삭제후에 삭제한 데이터의 다음 데이터부터 모두 한칸씩 앞으로 한칸씩 땡겨줘야한다. 그렇기 때문에 제일 뒤의 데이터 삭제에는 큰 문제가 없다. 삽입 ..

공부하기 2021.01.06

이너클래스(Inner Class)

class A { public: class AInner { public: int Data; }; public: A() { } ~A() { } }; int main() { A::AIner InnerNew = A::AInner(); } 이너클래스의 사용법은 위와 같고 클래스 내부에 그 클래스의 이름을 종속 받는 다른 클래스를 만들어 내는것이다. namespace AInner { class AInner { public: int Data; }; } 개념적으로 보면 네임스페이스와 비슷하다. 이너클래스는 그냥 클래스를 하나 새롭게 만드는것이고 동작역시 기존 클래스와 똑같이 동작한다. 다만 사용할때 A::을 붙여줘야 한다. 그럼 네임스페이스와 다른점은 무엇일까? 그건 접근제한 지정자를 가지고 있다는 것이다. clas..

C++ 2021.01.04

동적 메모리 할당과 해제,댕글링 포인터,vector의 내부동작

가상 함수 글에서 보면 Shop 있고 그 샵에서 CreateItem 함수를 이용해서 여러 종류의 아이템을 만들 수 있다. class NameBase { private: std::string m_Name; public: std::string Name() { return m_Name; } void Name(const std::string& _Name) { m_Name = _Name; } }; class Item : public NameBase { public: Item(std::string _Name, int _ItemType = 0) : m_Type(_ItemType) { Name(_Name); } public: virtual void Render() { std::cout

C++ 2020.12.31

Pure Virtual Function(순수 가상 함수)

class Item { private: int m_Cost; public: virtual int Cost() { return m_Cost; } void SetCost(int _Cost) { m_Cost = _Cost; } }; class Weapon : public Item { public: int m_Enchant; public: Weapon() : m_Enchant(0) { } public: void EnchantUp() { ++m_Enchant; } public: int Cost() { return Item::Cost() + Item::Cost() * m_Enchant; } }; 위의 코드는 Item 클래스를 부모로 만들고 Weapon 클래스에는 강화수치가 있으며 강화수치에 따라 가격이 달라지게 만..

C++ 2020.12.31

가상함수 추가설명

class A { public: }; class B : public A { public: }; int main() { } 여기까지만 보면 A 클래스의 크기는 1이다. class A { public: virtual void Func() { } }; 가상함수가 들어가는 순간 가상함수는 컴파일러가 기본적으로 함수포인터를 기반해서 동작시킨다. 그렇기 때문에 가상함수를 동작시키기 위한 함수포인터를 만들게 되고 (이때 이 가상함수 포인터는 가상함수 테이블 이라는 정식 명칭이 있다.) 함수포인터의 크기도 기본적으로는 일반 포인터와 같기때문에 각 객체마다 저 가상함수를 동작시키기 위한 가상함수 포인터가 하나 생긴다. (포인터의 크기는 32bit에서는 4byte 64bit에서는 8byte) (포인터는 램의 어느 위치를 ..

C++ 2020.12.31