π‘νμΌ κ²½λ‘
μ λκ²½λ‘ e.g.C:\image.png
μλκ²½λ‘ e.g..
,..
-.\
β λ΄ κ²½λ‘ (μ½λμμλ μ΄λ κ²(?).\\
)
-..\
β λ΄ κ²½λ‘μμ νλ² λ°μΌλ‘ λκ° κ²½λ‘
#include ".\Math.h"
β λ΄ ν΄λμ μλ Math.hλ₯Ό μ¬μ©νκ² λ€λ λ», #include "Math.h"
μ κ°λ€.
#include "..\
β μμ ν΄λμ λ΄μ©λ¬Όμ 보μ¬μ€λ€.
<
β VS ν¬ν¨ λλ ν°λ¦¬μ μ‘΄μ¬νλ νμΌμ μ¬μ©νκ² λ€λ λ»
$(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
}
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;
}
μ¬λ¬ λ°©λ²μΌλ‘ ν΄κ²°ν μ μλ€.
π’ μ½λ©μ€ν λ€λ
1. μ μλ³μμ μ§μλ³μλ μ΄λ¦μ ꡬλΆνμ¬ μμ±νμ
2. λ³μμλ λ°λμ μ΄κΈ°κ°μ μ€μ νμ
3. ν¨μμ μΈμ μμλ μΈλλ°λ₯Ό λΆμ΄μ
4. ν¬μΈν°λ₯Ό μ΄κΈ°νν λ μ λ 0μ μ¬μ©νμ§ λ§κ³ , nullptrμ μ¬μ©νμ
5. κ²½λ‘, ν¨μλͺ , λ³μλͺ μ νκΈμ μ λ μ°μ§ λ§μ
6. νλ‘μ νΈ μμ± μ λ°ννλ©΄μ μ λ νΌνμ
7. ifλ¬Έμ μ¬μ©ν λ, ν μ€ μ½λμΌμ§λΌλ λ°λμ μ€κ΄νΈλ₯Ό μ¬μ©νμ
8. ν¨μμ 리ν΄κ°μ κΌ λ³μλ‘ λ°μμ νμΈν΄λ³΄μ
9. ν΄λμ€λ₯Ό μ μνλ©΄ μΌλ¨ public, protected, private κΌ μμ±ν΄λμ
κ·Έλ¦¬κ³ μμλ₯Ό λ°κΎΈκ±°λ, μ΄νμ λ°μμ νλ² λ μ κ·Όμ νμ§μ μλ₯Ό μ¬μ©νκ±°λ νμ§λ λ§μ
10. ν΄λμ€κ° μ‘΄μ¬νλ νμΌλͺ μ μ¬λ§νλ©΄ ν΄λμ€λͺ κ³Ό λμΌν μ΄λ¦μΌλ‘ μ€μ νμ (new!)
~ λ―Έμ λΆλΆ κΈμμΌκΉμ§ λ§λ¬΄λ¦¬νκΈ° ~