C++ 36

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

이너클래스(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

Virtual Function(가상 함수),다운 캐스팅

자료구조의 사용선택 1. 왜 사용하는가? 2. 어떤때 어떤 자료구조를 사용해야 하는가? 이 두가지로 나뉜다. class Item { }; 위 클래스는 Item의 가장 기본기능을 정의하기 위해 만들어진 클래스다. 우선적으로 이름을 가지고 있어야 할거같은데 이름은 아이템에서만 사용되지않고 케릭터,스킬 등등 사용하는곳이 많다.그렇기 때문에 #include class NameBase { private: std::string m_Name; public: std::string Name() { return m_Name; } void Name(const std::string& _Name) { m_Name = _Name; } }; 이렇게 NameBase 클래스를 만들어서 상속해서 IS A 관계로 사용해서 설계할수 있다...

C++ 2020.12.31

Vector

#include int main() { std::vector Testvector; TestVector.push_back(10); TestVector.push_back(20); TestVector.push_back(5); } push_back() 이란 함수는 앞에서 본 수도코드로 Add 함수의 기능이며 자료를 추가하는 함수이다.위의 코드로 [10][20][5] 이런 방식으로 자료가 추가되며 시퀸스 컨테이너 인것을 알 수 있다. #include typedef int Data; class MyVector { private: int m_Capacity; int m_Size; Data* m_pData public: MyVector() : m_Size(0),m_Capacity(0),m_pData(nullptr) {..

C++ 2020.12.29