[TIL] 23-12-27

LevΒ·2023λ…„ 12μ›” 27일
0

πŸ““TIL Archive

λͺ©λ‘ 보기
12/33

#include

πŸ’‘νŒŒμΌ 경둜
μ ˆλŒ€κ²½λ‘œ e.g. C:\image.png
μƒλŒ€κ²½λ‘œ e.g. ., ..
- .\ β‡’ λ‚΄ 경둜 (μ½”λ“œμ—μ„œλŠ” μ΄λ ‡κ²Œ(?) .\\)
- ..\ β‡’ λ‚΄ κ²½λ‘œμ—μ„œ ν•œλ²ˆ λ°–μœΌλ‘œ λ‚˜κ°„ 경둜

#include ".\Math.h" β‡’ λ‚΄ 폴더에 μžˆλŠ” Math.hλ₯Ό μ‚¬μš©ν•˜κ² λ‹€λŠ” 뜻, #include "Math.h"와 κ°™λ‹€.
#include "..\ β‡’ μƒμœ„ ν΄λ”μ˜ λ‚΄μš©λ¬Όμ„ 보여쀀닀.

< β‡’ VS 포함 디렉터리에 μ‘΄μž¬ν•˜λŠ” νŒŒμΌμ„ μ‚¬μš©ν•˜κ² λ‹€λŠ” 뜻

  • ν”„λ‘œμ νŠΈ 우클릭 β†’ 속성 β†’ VC++ 디렉터리 β†’ 포함 디렉터리
  • ν”„λ‘œμ νŠΈλ³„λ‘œ λ‹€λ₯΄κ²Œ 섀정해쀄 수 μžˆλ‹€
  • $(VC_IncludePath);$(WindowsSDK_IncludePath);
    • 맀크둜둜 μž‘μ„±λœ 경둜, μ—¬λŸ¬ 파일의 경둜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€
    • ; β‡’ 의미 μžˆλŠ” 경둜λ₯Ό ꡬ뢄해쀀닀, μ‹€μˆ˜λ‘œ μ§€μš°μ§€ 말자

" β‡’ λ‚΄ 파일이 ν¬ν•¨λœ 디렉터리에 μ‘΄μž¬ν•˜λŠ” νŒŒμΌμ„ μ‚¬μš©ν•˜κ² λ‹€λŠ” 뜻

πŸ“’ ERROR
error C1083: 포함 νŒŒμΌμ„ μ—΄ 수 μ—†μŠ΅λ‹ˆλ‹€.
- #includeν•˜λ €λŠ” 파일이 μ—†λ‹€λŠ” 뜻
- 파일 경둜λ₯Ό λ‹€μ‹œ ν™•μΈν•˜μž

μˆœν™˜μ°Έμ‘°

사싀 #include에 λŒ€ν•œ μ΄ν•΄λŠ” μ»΄νŒŒμΌμ— λŒ€ν•œ 이해와 κ°™λ‹€.

πŸ“’ ERROR

μ „λ°©μ„ μ–Έ

μˆœν™˜μ°Έμ‘°λ₯Ό 막기 μœ„ν•΄

// []
#include <iostream>
#include "Player.h"

/*
λΉŒλ“œ : μ „μ²˜λ¦¬κΈ° -> 컴파일러 -> μ–΄μ…ˆλΈ”λŸ¬ -> 링컀
 
μ „μ²˜λ¦¬κΈ° => 주석 μ‚­μ œ, μ½”λ“œ μΉ˜ν™˜(#include)
1.  #pragma once λŠ” ν•œ 파일 λ‚΄λΆ€μ—μ„œ 헀더 쀑볡을 막아쀀닀.
2.  ν—€λ”νŒŒμΌμ—λŠ” μ΅œλŒ€ν•œ λ‹€λ₯Έ 헀더λ₯Ό μΆ”κ°€ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.
    μˆœν™˜μ°Έμ‘°μ˜ μœ„ν—˜μ΄ 있기 λ•Œλ¬Έ

컴파일러 => 쀑간 컴파일, μ€‘κ°„νŒŒμΌ .obj λ§Œλ“€κΈ°
1.  λ„€μž„λ§ΉκΈ€λ§ λ“±μ˜ κΈ°λŠ₯을 μ΄μš©ν•΄μ„œ ν•¨μˆ˜λ‚˜ 쀑간 μ»΄νŒŒμΌμ„ ν•˜κ²Œ λœλ‹€.
    μ΄λ•Œ, μ»΄νŒŒμΌμ€ .cpp 파일 λ‹¨μœ„λ‘œ ν•˜κ³ , λŒ€μ‘λ˜λŠ” .obj 파일이 μƒμ„±λœλ‹€.
    ν—€λ”λŠ” 컴파일의 주체가 μ•„λ‹ˆλ‹€.
    κ°€μž₯ μ€‘μš”ν•œ 것은 ν•¨μˆ˜κ°€ μŠ€νƒμ—μ„œ μ‹€ν–‰λ˜λ©° μ°¨μ§€ν•˜λŠ” λ©”λͺ¨λ¦¬ 크기

μ–΄μ…ˆλΈ”λŸ¬ => μ§„μ§œ 기계어 μ½”λ“œλ‘œ λ³€κ²½
    λ„ˆλ¬΄ μžμ„Έν•œκ±Έ μ•Œλ €κ³  ν•˜μ§€ 말자...

링컀 => 
    .obj νŒŒμΌμ—μ„œ κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­λœκ±Έ λͺ¨λ‘ λͺ¨μœΌκΈ°
    각 .obj νŒŒμΌλ“€μ˜ 기계어 λ²ˆμ—­μ„ μ—°κ²°ν•΄μ„œ 1개의 파일둜 μ—°κ²°ν•œλ‹€.
    .obj 파일이 아무리 λ§Žμ•„λ„ .exe νŒŒμΌμ€ 1개 뿐이닀.
*/

/*
헀더에 κ΅¬ν˜„μ΄ μžˆλŠ”κ±΄ λ¬Έμ œκ°€ λ°œμƒν•  κ°€λŠ₯성이 λ„ˆλ¬΄λ„ˆλ¬΄ λ†’λ‹€
μ΅œλŒ€ν•œ μ² μ €ν•˜κ²Œ μ„ μ–Έκ³Ό κ΅¬ν˜„μ„ ν—€λ”νŒŒμΌκ³Ό .cpp파일둜 λΆ„ν• ν•  것!

ν•¨μˆ˜
void Test();

클래슀
class Player*;
class Player&;
=> 전방선언은 λ°˜λ“œμ‹œ μ°Έμ‘°ν˜•μ΄μ–΄μ•Ό ν•œλ‹€

λ³€μˆ˜
extern int Value;
=> μ‹€μ œλ‘œ μ‘΄μž¬ν•˜λŠ” 것은 μ•„λ‹ˆκ³ , μžˆμ„ 것이라고 λ§ν•΄μ£ΌλŠ” 것
extern int Value = 0;
=> μ΄λ ‡κ²Œ μ΄ˆκΈ°ν™”ν•΄λ²„λ¦¬λ©΄ λ³€μˆ˜λ‘œ 인정돼버린닀
*/

int main()
{
    Player NewPlayer;
}
// []
#pragma once
#include "Monster.h"

class Player
{
	Monster NewMonster;
	// Player 클래슀의 μ‹€ν–‰λ©”λͺ¨λ¦¬ 크기λ₯Ό μ•ŒκΈ° μœ„ν•΄μ„œλŠ”
	// λ©€λ²„λ‘œ 듀어와 μžˆλŠ” Monster 클래슀의 크기λ₯Ό μ•Œμ•„μ•Ό ν•˜λ―€λ‘œ
	// ν—€λ”νŒŒμΌμ„ ν¬ν•¨μ‹œμΌœμ€˜μ•Ό ν•œλ‹€

	/*
	[μ „λ°©μ„ μ–Έ]
	class Monster* NewMonster;
	class Monster& NewMonster;

	μœ„μ™€ 같이 μ„ μ–Έν•  κ²½μš°μ—λŠ” ν—€λ”νŒŒμΌμ„ ν¬ν•¨ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
	크기가 8byte둜 κ³ μ •λ˜κΈ° λ•Œλ¬Έμ— ν—€λ”νŒŒμΌλ‘œ 클래슀의 정보λ₯Ό 뢈러올 ν•„μš”κ°€ μ—†λ‹€.
	
	ν•˜μ§€λ§Œ ν¬μΈν„°λ‘œ λΆˆλŸ¬μ™€λ„ μ•„λž˜μ™€ 같이 클래슀의 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜κ²Œ 되면
	μ‘΄μž¬μ—¬λΆ€λ₯Ό νŒŒμ•…ν•΄μ•Ό ν•˜λ―€λ‘œ ν—€λ”νŒŒμΌμ„ ν¬ν•¨μ‹œμΌœμ•Ό ν•œλ‹€.

	void Test()
	{
		NewMonster->Damage(10);
	}

	λ”°λΌμ„œ κ΅¬ν˜„λΆ€λŠ” 무쑰건 μ„ μ–Έκ³Ό λΆ„λ¦¬ν•˜λŠ” 것이 μ’‹κ³ ,
	ν—€λ”νŒŒμΌμ—μ„œ λ‹€λ₯Έ 헀더λ₯Ό μΆ”κ°€ν•˜μ§€ μ•ŠμœΌλ €κ³  λ…Έλ ₯ν•΄μ•Ό ν•œλ‹€.
	*/

	int Att;
};

πŸ“’ ERROR
error C2374 : μž¬μ •μ˜, μ—¬λŸ¬ 번 μ΄ˆκΈ°ν™”ν–ˆμŠ΅λ‹ˆλ‹€.
- CλŠ” 컴파일러 μ—λŸ¬λΌλŠ” 뜻

error LNK1169 : μ—¬λŸ¬ 번 μ •μ˜λœ κΈ°ν˜Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.
- LNKλŠ” 링컀 μ—λŸ¬λΌλŠ” 뜻

클래슀 (μ΄μ–΄μ„œ)

상속

λ¬Έλ²•μ˜ λ°œμ „μ€ μ½”λ“œ μž¬ν™œμš©μ„±μ„ μ¦κ°€μ‹œν‚€λŠ” λ°©ν–₯으둜 λ°œμ „ν–ˆλ‹€.

class FightUnit	// μ „νˆ¬ν•˜λŠ” λŒ€μƒμ΄ κ³΅ν†΅μ μœΌλ‘œ κ°€μ§€λŠ” κΈ°λŠ₯
{
public:
	int Att = 10;
	int Hp = 100;

public:
	void Damage(int _Att)
	{
		Hp -= _Att;
	}
};

// : (μ ‘κ·Όμ œν•œμ§€μ •μž) (λΆ€λͺ¨ν΄λž˜μŠ€ 이름)
class Player : public FightUnit
{

};

class Monster : public FightUnit
{

};

int main()
{
	Player NewPlayer = Player();
	NewPlayer.Att = 10;
	NewPlayer.Damage(20);

	Monster NewMonster = Monster();
	NewMonster.Att = 10;
	NewMonster.Damage(20);
}
/*
			μ™ΈλΆ€	μžμ‹	멀버
public		O		O		O
protected	X		O		O
private		X		X		O
*/

#include <iostream>

class FightUnit
{
public:
	int publicInt = 0;
	void publicFunction()
	{

	}

protected:
	int protectedInt = 0;
	void protectedFunction()
	{

	}

private:
	int privateInt = 0;
	void privateFunction()
	{

	}

};

// 상속을 λ°›κ²Œ 되면, λΆ€λͺ¨ν΄λž˜μŠ€μ˜ 멀버듀이 λͺ¨λ‘ λ‚΄λΆ€λ‘œ λ³΅μ‚¬λ˜λŠ” 것
// μžμ‹μ΄ λΆ€λͺ¨μ˜ private 멀버듀에 μ ‘κ·Όν•  수 없을 뿐이닀
// ν•˜μ§€λ§Œ, λΆ€λͺ¨κ°€ private λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” Set ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€λ©΄ μžμ‹λ„ μ ‘κ·Όν•  수 μžˆλ‹€
class publicPlayer : public FightUnit
{
	/*
	public:
		int publicInt = 0;
		void publicFunction()
		{

		}

	protected:
		int protectedInt = 0;
		void protectedFunction()
		{

		}
	*/
};

class protectedPlayer : protected FightUnit
{
	/*
	protected:
		int publicInt = 0;
		void publicFunction()
		{

		}

		int protectedInt = 0;
		void protectedFunction()
		{

		}
	*/
};

class privatePlayer : private FightUnit
{
	/*
	private:
		int publicInt = 0;
		void publicFunction()
		{

		}

		int protectedInt = 0;
		void protectedFunction()
		{

		}
	*/
};

int main()
{
	FightUnit Unit = FightUnit();
	publicPlayer Player0 = publicPlayer();
	protectedPlayer Player1 = protectedPlayer();
	privatePlayer Player2 = privatePlayer();

	printf_s("Unit Size = %lld", sizeof(Unit));	// 12
	printf_s("publicPlayer Size = %lld", sizeof(publicPlayer));	// 12
	printf_s("protectedPlayer Size = %lld", sizeof(protectedPlayer));	// 12
	printf_s("privatePlayer Size = %lld", sizeof(privatePlayer));	// 12
}

Console Game (상속 ver.)

Player ν΄λž˜μŠ€μ™€ Bullet 클래슀의 κ³΅ν†΅λœ 뢀뢄을 ConsoleObject 클래슀둜 λ§Œλ“€μ–΄ μƒμ†μ‹œμΌœμ£Όμž.

// [ConsoleObject.h]
#pragma once
#include "Math.h"
// Player와 Bullet이 κ³΅ν†΅μœΌλ‘œ 가지고 μžˆλŠ” ν—€λ”λŠ” μ—¬κΈ°λ‘œ 빼주어도 λœλ‹€

class ConsoleObject
{
public:
	// inline ν•¨μˆ˜λ“€ 뿐이라 여기에 μž‘μ„±ν•΄μ£Όμ—ˆμ§€λ§Œ,
	// μ‹€μ œλ‘  μ—¬κΈ°μ—λŠ” 선언을, κ΅¬ν˜„μ€ ConsoleObject.cpp νŒŒμΌμ— ν•˜λŠ” 것이 μ’‹λ‹€
	inline int2 GetPos()
	{
		return Pos;
	}

	inline char GetRenderChar()
	{
		return RenderChar;
	}

protected:
	// μ™ΈλΆ€μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†κ²Œ, μƒμ†λ°›λŠ” μžμ‹μ΄ μ ‘κ·Όν•  수 있게 ν•˜κΈ° μœ„ν•΄
	// λ©€λ²„λ³€μˆ˜λŠ” protected둜 μ„ μ–Έν•΄μ£Όμ—ˆλ‹€
	int2 Pos = { 0, 0 };
	char RenderChar = '@';
};
// [Bullet.h]
#pragma once
#include "ConsoleObject.h"
// ν—€λ”νŒŒμΌμ΄μ–΄λ„ 상속 받을 땐 λ°˜λ“œμ‹œ 헀더λ₯Ό 포함해야 ν•œλ‹€

class Bullet : public ConsoleObject	// 상속
{
public:
	Bullet(const int2& _StartPos, char _RenderChar);

	bool& GetIsFireRef()
	{
		return IsFire;
	}

private: 
	bool IsFire = false;
};
// [Bullet.cpp]
#include "Bullet.h"

Bullet::Bullet(const int2& _StartPos, char _RenderChar)
//	: Pos(_StartPos), RenderChar(_RenderChar)
// 상속 받은 λ³€μˆ˜λŠ” μƒμ„±μžμ— μ‚¬μš©ν•  수 μ—†λ‹€...?
{
	Pos = _StartPos;
	RenderChar = _RenderChar;
	// λ”°λΌμ„œ μ΄ˆκΈ°ν™”ν•˜λŠ” λŒ€μ‹  λŒ€μž…ν•΄μ€€λ‹€
}
// [Player.h]
#pragma once
#include "ConsoleObject.h"

class Player : public ConsoleObject	// 상속
{
public:
	Player();
	
	Player(const int2& _StartPos, char _RenderChar);

	void Update();

	void SetBulletFire(bool* _IsFire);

private:
	bool* IsFire = nullptr;
};
// [Player.cpp]
#include <conio.h>
#include "Player.h"
#include "ConsoleScreen.h"

Player::Player()
{

}

Player::Player(const int2& _StartPos, char _RenderChar)
//	: Pos(_StartPos), RenderChar(_RenderChar)
{
	Pos = _StartPos;
	RenderChar = _RenderChar;
}

void Player::Update()
{
	int Value = _getch();

	switch (Value)
	{
	case 'a':
	case 'A':
	{
		if ((Pos + Left).X != 0)
		{
			Pos += Left;
		}
		break;
	}
	case 'd':
	case 'D':
	{
		if ((Pos + Right).X != (ScreenX - 2))
		{
			Pos += Right;
		}
		break;
	}
	case 'w':
	case 'W':
	{
		if ((Pos + Up).Y != 0)
		{
			Pos += Up;
		}
		break;
	}
	case 's':
	case 'S':
	{
		if ((Pos + Down).Y != (ScreenY - 1))
		{
			Pos += Down;
		}
		break;
	}
	case 'q':
	case 'Q':
	{
		if (nullptr != IsFire)
		{
			*IsFire = true;
		}
	}
	default:
		break;
	}
}

void Player::SetBulletFire(bool* _IsFire)
{
	if (nullptr == _IsFire)
	{
		return;
	}

	IsFire = _IsFire;
}

μ—¬λŸ¬ λ°©λ²•μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλ‹€.

  • μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™” λŒ€μ‹  λŒ€μž…μ„ μ΄μš©ν•˜λŠ” 방법 β‡’ 이걸둜 ν•΄κ²°!
  • λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜κ³ , SetPos() ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ Player와 Bullet의 μœ„μΉ˜λ₯Ό μ •ν•΄μ£ΌλŠ” 방법

πŸ“’ μ½”λ”©μŠ€νƒ λ‹€λ“œ
1. μ „μ—­λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜λŠ” 이름을 κ΅¬λΆ„ν•˜μ—¬ μž‘μ„±ν•˜μž
2. λ³€μˆ˜μ—λŠ” λ°˜λ“œμ‹œ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜μž
3. ν•¨μˆ˜μ˜ 인자 μ•žμ—λŠ” 언더바λ₯Ό λΆ™μ΄μž
4. 포인터λ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ μ ˆλŒ€ 0을 μ‚¬μš©ν•˜μ§€ 말고, nullptr을 μ‚¬μš©ν•˜μž
5. 경둜, ν•¨μˆ˜λͺ…, λ³€μˆ˜λͺ…에 ν•œκΈ€μ€ μ ˆλŒ€ 쓰지 말자
6. ν”„λ‘œμ νŠΈ 생성 μ‹œ 바탕화면은 μ ˆλŒ€ ν”Όν•˜μž
7. if문을 μ‚¬μš©ν•  λ•Œ, ν•œ 쀄 μ½”λ“œμΌμ§€λΌλ„ λ°˜λ“œμ‹œ μ€‘κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μž
8. ν•¨μˆ˜μ˜ 리턴값을 κΌ­ λ³€μˆ˜λ‘œ λ°›μ•„μ„œ ν™•μΈν•΄λ³΄μž
9. 클래슀λ₯Ό μ •μ˜ν•˜λ©΄ 일단 public, protected, private κΌ­ μž‘μ„±ν•΄λ‘μž
그리고 μˆœμ„œλ₯Ό λ°”κΎΈκ±°λ‚˜, 이후에 λ°‘μ—μ„œ ν•œλ²ˆ 더 μ ‘κ·Όμ œν•œμ§€μ •μžλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ ν•˜μ§€λŠ” 말자
10. ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” 파일λͺ…은 μ›¬λ§Œν•˜λ©΄ 클래슀λͺ…κ³Ό λ™μΌν•œ μ΄λ¦„μœΌλ‘œ μ„€μ •ν•˜μž (new!)

~ λ―Έμ™„ λΆ€λΆ„ κΈˆμš”μΌκΉŒμ§€ λ§ˆλ¬΄λ¦¬ν•˜κΈ° ~

profile
β‹†κ™³βŠΉβ‹° 𓇼⋆ 𝑻𝑰𝑳 𝑨𝑹π‘ͺ𝑯𝑰𝑽𝑬 βΈΒ·βΈβ‹†κ™³βŠΉβ‹°

0개의 λŒ“κΈ€