월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
참조자 리턴 질문입니다.
Position& operator++() { _x++; _y++; return *this; } 질문1) 제가 이해하기로는 Position&이 리턴이면 resturn *this에서 *this가 실제로 존재하는 메모리상에서 꺼내와서 쇽 넘기는거고 Position으로 리턴하면 실제값을 복사해놓고 복사된 값을 넘겨주는거다 라고 생각이 드는데 여기서 리턴타입이Position& 일때와 Position일때 와의 차이가 성능? 말고 또 존재하는게있나요? 자기자신 참조라는게 어감때문인지 Position&과 Position의 디테일한 차이를 잘 모르겠습니다. 질문2) 연산자 오버로딩 중에 무조건 리턴타입이 참조자리턴이어야하는 경우가 있나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
타입변환#2 질문있습니다.
// [2] 참조 타입 변환 // 특징) 비트열을 재구성하지 않고, '관점'만 바꾸는 것 // 거의 쓸일은 없지만, 포인터 타입 변환도 '참조 타입 변환' 동일한 룰을 따르니까 1석2조로 공부하자 { int a = 123456789; // 2의 보수 float b = (float&)a; // 부동소수점(지수 + 유효숫자) cout << b << endl; } 강의중 나왔던 코드입니다. float b = (float&)a; 의 문법이 이해가 잘 안됩니다..ㅠㅠ float타입의 b변수에 왜 float& (<<< 저는 이걸 주소라고 생각하고있습니다.) 형변환을 해서 넘기는지 모르겠습니다. a를 float주소형태???? 로 변환?? 이게 잘 이해가안됩니다.. 저렇게 해서 넘기면 b에는 포인터처럼 주소가 들어있어야 하는게 아닌가요?..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
객체지향 마무리 질문있습니다.
class Marine { public: // 특정 마린 객체에 종속적 int _hp; void TakeDamage(int damage) { _hp -= damage; } static void SetAttack() { s_attack = 100; } // 특정 마린 객체와 무관 // 마린이라는 '클래스' 자체와 연관 static int s_attack; // 설게도 상으로만 존재 }; int GenerateId() { // 생명주기 : 프로그램 시작/종료 (메모리에 항상 올라가 있음) // 가시범위 : // 정적 지역 객체 static int s_id = 1; return s_id++; } 강의에서 나오는 Marine클래스와 GenerateId()함수입니다. 강의 중 GenerateId()함수를 여러번 부를 경우 정적 지역 객체인 s_id가 계속해서 1로 초기화 되는 것이 아닌, 처음 함수를 부를 때만 1으로 초기화 되고 그 다음부터는 ++만 연산해서 1, 2, 3, ... 과같이 s_id가 계속해서 증가하는 모습을 보였습니다. 그래서 저는 Marine클래스의 SetAttack()도 처음에만 100으로 세팅해주는것인가? 라는 생각이 들어 Marine::SetAttack(); cout << m1.s_attack << endl; Marine::s_attack = 7; cout << m1.s_attack << endl; Marine::SetAttack(); cout << m1.s_attack << endl; 이렇게 실행해 보았으나, 출력이 100 7 100으로 다시 초기화가 된 것을 확인하였습니다. 왜 SetAttack()은 부를때마다 초기화가 진행되고 GenerateId()는 그렇지 않은 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
이중포인터 질문있습니다.
안녕하세요 강사님. 질문있습니다. 1번 질문) char* a = "abc"; cout << a; // 출력 값 : abc a는 문자열 "abc"의 주소값을 받는 ptr로 이해하고 있습니다만, 위와 같이 코딩 후 출력하면 주소값이 아닌 문자열이 출력되는 것을 확인할 수 있었습니다. 이 부분은 다른 분의 질문을 통해 cout이 문자열의 경우 주소가 아닌 문자를 NULL 부분까지 쭉 출력한다고 이해했습니다. 제가 제대로 이해한 것이 맞는 것인지 궁금합니다. 분명 주소가 나와야하는데, 값이 나오니 기존에 공부했던 개념까지 흔들려서 다시 찾아보는 어려움이 있었습니다... 2번 질문) 추가) 2번 질문은 함수의 매개변수로 넘겨줄 때 사용하는 것으로 강의 다시 보면서 이해했습니다. 감사합니다. const char* b = "aaa"; b = "bbb"; 위와 같은 상황에서는 b에 문자열 aaa의 주소값을 저장하고, char을 상수화시켰기 때문에 직접적으로 값을 변경하지는 못하고, bbb의 주소값을 b에 넣어줌으로써 메모리 주소값을 변경한 것으로 이해했습니다. const char* b = "aaa"; const char** c = &b; *c = "bbb"; 문제는 위와 같은 상황인데, 이것 또한 결국엔 b에 저장되어있는 aaa의 주소값을 bbb의 주소값으로 변경해주것이지, b의 char을 직접적으로 변경해준 것도 아닌데 굳이 이중포인터를 쓰는 이유가 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
글로벌 선언? 전역선언? 을 하니까 함수 포인터의 fn 까지는 잘 되는데 그이후가 안되네요
int sub(int a, int b) { return a + b; } typedef int(Fanc_sub)(int, int); Fanc_sub* fn; fn = sub; int main() { int c = fn(1, 2); cout << c << endl; return 0; } mine 실행부분 안쪽에 넣어놓지 않고 그 외부에 선언을 하니까 저 빨간부분이 작동을 하지 않는데 왜 그러는걸까요 ㅠㅠ 느낌상 메인함수안에서 무언가가 작동해야 되는데 스택 메모리 관련된 부분인가요? 딱 저부분에만 빨간줄이 처지고 형식 지정지가 없다고 나옵니다 뭣때문에 저부분에서는 안되는걸까요 ㅠㅠ
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
덱에서 순차접근은 벡터보다 느린가요?
STL 덱에서 모든 원소를 접근할때 벡터보다 더 느린가요? 벡터는 연속된 메모리라서 괜찮지만, 덱은 모든 데이터가 연속된 메모리에 저장되지 않아서 순차적으로 모든 데이터를 접근할때 메모리상 점프해야하는일이 생길것 같아서 이 부분 때문에 매우 많은 데이터를 모두 순차접근해야하는 경우에 벡터보다 성능이 훨씬 떨어질 수 있다고 이해해도 괜찮은건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
루키스님! 커리큘럼 관련 질문이 있어요
자료구조 알고리즘 배운 뒤 Direct를 배우고 싶어서 그러는데 Part1 c++ 듣고 Part3 자료구조 알고리즘 듣고 Part2 Direct 들어도 괜찮을까요?! 답변 기다리고 있겠습니다 :) !
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
vector 순회 vs map 순회
안녕하세요. 루키스님 STL 강의를 보다가 순회하는 속도에 대해서 궁금한 점이 있어서 질문을 남깁니다. 1만개의 데이터가 있을 때 vector로 순회하는 것보다 map으로 순회하는 것이 느리다고 하셨는데 그 이유가 무엇인가요? vector 같은 경우 iterator를 직접 사용하지 않고 바로 인덱스로 순회할 수 있고 map은 iterator를 한칸씩 증가하면서 순회해야하기 때문인 것인가요? 혹은 vector는 메모리가 연속되어 있기 때문에 템퍼럴 로컬리티와 스페이셜 로컬리티 특성으로 인해 캐시히트가 잘 일어나게 되고 map은 메모리가 연속되어 있지 않기 때문에 반대로 캐시 미쓰가 많이 일어나서 그런 것인가요?? list또한 궁금합니다. 나머지 2개의 컨테이너와 비교했을 때 순회하는 속도가 어떤지도 궁금합니다. vector list map을 for문으로 순회하는 것에 대해서 무엇이 빠르고 느린지 이유를 알고 싶습니다!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
list 노드의 next 와 previous 질문입니다.
선생님과 같이 메모리를 보면서 실습중에 궁금증이 하나 생겼는데 저 게지금 &itBegin 이렇게쳐서 나온값중에 세번째값 을 타고 들어간 상황입니다. 저기서 첫번째는 next 두번째는 previous 세번째가 data라고 하셨는데 실제로 저 첫번째 주소를 타고가면 두번째 노드가 나오고 다음값에서 previous를 타고 가면 다시 첫번째 노드가 나오더라구요 근데 첫번째 노드에도 previous쪽에 주소가 하나들어있는데 그걸 타고들어가면 뭐 이상한 값들이 있습니다. STL 에서 제공하는 list는 이중 연결 리스트라 맨뒤 노드로 가는건 아닌거같고 맨처음 값이면 previous가 필요가없을텐데? 어떤용도의 값인지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
24분경 if else문질문입니다.
그 땡겨진 자리 체크를 하는 이유가 데이터가 3 3이렇게 연속으로 있을경우 삭제된 3자리에 다시 3이들어가게 되는데 바로 ++it를하면 땡겨저 들어온3이 있음에도 불구하고 ++연산으로 다음으로 넘어가버리기 때문에 필요한 건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
문제가 생겼습니다 컴퓨터의 문제가 생겨 포멧을 했는데 2019버전을 다운을 받을수 없습니다
2022버전으로 해도 문제가 없는건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
공부 방법에 대한 질문?
CPP 강의를 중후반까지듣고 알고리즘, 자료구조 강의를 듣는데 분명 배운내용임에도 불구하고 이게 뭐였지? 라는 생각으로 다시 해당하는 내용의 강의를 들으러가면 뭔가 처음 배우는 것 같은 느낌이 듭니다, 많이들 쓰는 문법이야 뭐 백준문제라도 풀어서 체득을 하겠는데 연산자 오버로딩?같이 애매한 것들은 뭔가 for문 별찍기같은 예제가 없는거 같더라구요... 그래서 그냥 그렇구나 하고 넘기면 나중에 사고가나서 다시 앞의 내용을 듣고 뭔가 알고있다 라고 하기도 애매한 상태로 변하고 다시 진도나가고 무한반복중인데 공부법 꿀팁이 있을까요...
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Test1.cpp에 대해 질문이 있습니다.
Test1.h Test1.cpp를 링크하는 부분은 이해가 가지만 main.cpp에서 Test1.cpp는 따로 링크해주지 않고 Test1.h만 링크해주면 되는 이유가 무엇인지 궁금합니다. cpp 파일들은 비주얼 스튜디오에서 컴파일을 할 때 알아서 링크가 되는건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
깊은 복사 방식을 이용하여 복사 넘기기 할때 이런식으로 참조값을 사용해서 넘겨도 heep 메모리 영역에 정상적으로 생성 되나요?
일단 new 문법으로 heep 영역의 동적 할당을 할때 기본적으로 void* 주소값을 넘겨주는것으로 알고 있습니다 하지만 이것을 명시적으로? 예를들어 클레스가 하나 있다고 가정했을때 class Plyear 라는 클래스를 생성할때 Plyear plyear = new Plyear() 이런식으로 동적 할당역역을 사용하고 delete 문법을 사용하여 메모리를 delete plyear; 이렇게 하여 초기화 시키는걸로 알고 있습니다 여기서 전 & 타입으로 해보고 싶어서 이런식으로 바꿔봤습니다 클레스는 위와 동일하다 가정하고 Plyear &plyear = *new Plyear() 이런식으로 만들어 봤는데 여기서 한가지 의문이 들었습니다. 정상적으로 잘 만들어지긴 하는데 주소값을 입력 하면 깊은 복사로 만들었을때 복사 방식을 분명 제대로 줬음에도 불구 하고 heep 영역에 잡히는게 맞는지 이걸 확인할 방법이 보이지가 않아서 어떻게 확인할수 있는지 보다도 정확하게 만든게 맞는지 그게 궁금 합니다 ㅠㅠ 실제 코드는 아래와 같습니다 #include <iostream> using namespace std; #define out class Pet { public: Pet () { cout<< "Pet ()"<< endl; } Pet (const Pet& pet) { cout<< "Pet (const Pet& pet)"<< endl; } Pet& operator=(const Pet& pet) { cout<< "operator=(const Pet& pet)"<< endl; return *this; } virtual ~Pet () { cout<< "~Pet ()"<< endl; } public: int Pet_hp=50; }; class Plyear { public: Plyear () { cout<< "Plyear ()"<< endl; } Plyear (const Plyear& plyear) { cout<< "Plyear (const Plyear& plyear)"<< endl; } Plyear& operator=(const Plyear& plyear) { cout<< "operator=(const Plyear& plyear)"<< endl; _level=plyear._level; return *this; } virtual ~Plyear () { cout<< "~Plyear ()"<< endl; } public: int _level=0; }; class Knight: public Plyear { public: Knight () { cout<< "Knight ()"<< endl; } Knight (const Knight& kinght): Plyear(kinght) ,_pet2(*new Pet(kinght._pet2)) ,_hp(kinght._hp) { cout<< "Knight (const Knight& kinght)"<< endl; } Knight& operator=(const Knight& kinght) { cout<< "operator=(const Knight& kinght)"<< endl; Plyear::operator=(kinght); _pet2=*new Pet(kinght._pet2); _hp=kinght._hp; return *this; } virtual ~Knight () { cout<< "~Knight ()"<< endl; delete &_pet2; } public: int _hp=0; Pet& _pet2=*new Pet(); }; int main () { Knight knight; knight._hp=100; knight._level = 99; cout<<"----------------------------------"<<endl; Knight knight2; knight2=knight; knight2._pet2.Pet_hp=10; cout<<"----------------------------------"<<endl; cout<<"knight1.Pet_hp:"<< knight._pet2.Pet_hp <<endl; cout<<"knight2.Pet_hp:"<< knight2._pet2.Pet_hp <<endl; return 0; } 깊은복사를 이용하여 pet 부분만 새로운 객채를 생성하는 그런걸 응용해봤는데 이게 정상적으로 heep 영역에 메모리가 할당 되는지 그게 궁금한대 도저히 어떻게 확인할수 있는방법이 보이지 않습니다 ㅠㅠ 제가 좀 이상한건지 아니면 결벽증이 있는건지는 모르겠지만 heep 영역에 정상적으로 메모리가 할당 되었던건지 알려주시면 감사하겠습니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Hello World 빌드 하면 Warning! Errors have occurred in the build:오류가 생깁니다
Warning! Errors have occurred in the build: C:\Users\lee\AppData\Local\Temp\SASM\program.asm:15: error: comma expected after operand 1 gcc.exe: error: C:\Users\lee\AppData\Local\Temp\SASM\program.o: No such file or directory [11:38:19] Before debugging you need to build the program. 이런식으로 오류가 생기는데 어떻게 하면 될까요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
weakCount가 무엇의 갯수인지 헷갈립니다
refCount는 이 객체를 참고하는 애가 몇 명인지 인데 _weakCount는 "weak_ptr가 몇개가 지금 이 객체를 참고하고 있는지 관리한다" 라는 말이 refCount는 참조하고 있는 복수의 shared_ptr의 갯수를 뜻한다면 weakCount는 받고 있는 shared_ptr 가 받고 있는 객체가 살아있는지 죽어있는지 0 아니면 1이라고 이해해도 될까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
iterator의 end()에 대해
iterator의 end()함수가 왜 마지막 요소가 아닌 마지막 다음을 가리키는지 이유가 궁급합니다! 뭔가 그렇게 설계한 이유가 있을것 같은데 혹시 그런 이유가 있을까요? 문득 생각난건 연결리스트를 처음 설계할때 노드(Node) 설계 부분에서 헤드 노드를 만드냐 안만들고 하냐 등등의 차이로 설계방식이 달라지는것처럼 iterator도 헤드 노드를 따로 만들어놨던게 아닐까 싶은데 혹시 이유가 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
한번만 더 질문드립니다 ㅠㅠ
void* pointer = malloc (sizeof (Monster)); Monster& m1 = *( ( Monster* ) pointer ); m1._hp = 100; m1._attack = 10; m1._mp = 5; free (pointer); 이런식으로 해도 작동이 되는데 혹시 제가 이해한게 맞는건지 정확하게 이해 한듯 느낌이 팍 왔는데 확인할 방법이 없어서 이렇게 질문드려봅니다 일단 pointer 이부분이 반환값이 void 형 주소값을 반환받는건데 Monster 이부분은 클레스 타입이므로 Monster클레스 타입의 주소값을 Monster*로 포인터를 만들어 줬는데 이 주소값과 pointer 주소값이 서로 만들어진 형식이 한쪽은 void 고 한쪽은 class 이므로 Monster* m1 = (Monster*) pointer 이런식으로 하는이유가 pointer 가 void 형식의 주소값인건 아는데 지금은 Monster*값을 쓸꺼야 하고 괄호를 열어서 (Monster*)이라는걸로 확인시켜 줬기 때문에 Monster* m1에 정상적으로 이식이 된거고 여기서 참조 형태로 바꾸고 싶어서 Monster& m1으로 바꿨으니 void로 주소값을 반환 하는 pointer 가 참조형태로 탈바꿈? 하기 위해서 앞에 *을 하나 더 찍는방식으로 참조 타입으로 이식 됬다 라고 판단 되는데 그럼 처음 답변해주셨던 (Monster&)*((Monster*)pointer ) 이분부분에서 굳이 (Monster&)이부분은 삭제해도 어차피 (Monster*)이부분에서 class 탑입으로 바꾸겠다고 했으니 생략이 가능한게 아닌지 위에 코드도 동일하게 주소랑 값들이 다 나오는데 혹시 제가 착각하고 있는게 있는지 ......아니면 정상적으로 제가 생각한게 맞는지 궁금합니다 ㅠㅠ 질문이 길어져서 죄송합니다 열심히 공부해서 꼭 게임한번 만들어 보고 싶어서 문법 열심히 공부하는데 시골이라 학원도 없고 오직 온라인으로 밖에 공부할수 없는 이 슬픈 현실이 너무 절 괴롭게 합니다 ..... 소중한 시간을 항상 내주시는거에 대해 정말 감사드립니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
new / delete 던 malloc / free 던 *말구 &값으로 넘기는법은 없는건가요?
class Monster { public: int _hp; int _attack; int _mp; }; void* pointer = malloc (sizeof (Monster)); Monster* m1 = (Monster*) pointer ; m1->_hp = 100; m1->_attack = 10; m1->_mp = 5; free (pointer); 요기서 포인터 부분을 전부 void* pointer = malloc (sizeof (Monster)); Monster& m1 = (Monster&) pointer ; m1._hp = 100; m1._attack = 10; m1._mp = 5; free (pointer); return 0; 이런식으로 바꿔줬습니다 메모리까지는 정상적으로 할당 하는듯 보이는데 마지막 free에서 예외가 발생했다고 정지가 되버리네요 혹시 여기서 &방식으로 참조방식으로 만들수는 없는건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
연산자에 대한 질문이 있어서 올려봅니다
연산자 오버로딩 #2 강의에서 Position operator++(int) { Position ret=*this; _x++; _y++; return ret; } 이버전과 Position& operator++(int) { _x++; _y++; return *this; } 이버전은 실제 차이가 없는게 아닌지 궁금합니다 어차피 return으로 리턴값을 받아올때 자기 자신의 주소값을 받아 오는데 *this 던 Position 의 ret에 복사 주소값을 받아오던 별차이가 없는게 아닌지 궁금합니다 아그리고 코딩하면서 생각해봤는데 윗버전은 좀 문제가 있어 보이는데 사실 이게 맞는게 아닌지 의문이 듭니다 Position operator++(int) { Position ret=*this; _x=ret._x++; _y=ret._y++; return ret; } 이렇게 되야 맞는말이 되는거 아닌지 그래야 말이 되는거 아닌가요?