월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
임시 객체 질문
swap함수를 설명하시면서 임시벡터라는 말이 나왔는데 임시 벡터라는 말이 class Knight{public: Knight() { cout << "Knight()" << endl; }public: int _a = 10;}; int main(){ Knight k1; // 스택에 생성 int value = Knight()._a; // 임시 객체? return 0;} 이런 클래스가 있을 경우 main함수안에서 Knight k1; 해주면 Knight의 객체가 스택에 생성된 것이고 다시 main함수 내에서 int value = Knight()._a; 를 해준다는 말이 객체라는 것이 어떤 클래스와 같은 '설계도'의 오브젝트)객체)인데 이 객체를 만들면 설계도의 '생성자' 함수가 호출이 된다. 질문1. 생성자 함수를 호출을 어떻게든 한다면은 '객체'를 만들 수 있다는 말인가요? 이말이 맞다면 public:을 열러있는 Knight의 생성자를 강제?로 호출하여 객체를 만드는데 그 객체의 멤버 변수인 _a를 value에 대입해준다. 근데 Knight() 생성자만 호출하고 다른 객체 변수에(Knight타입의 변수) 할당하지 않아서 사용되지 않는 메모리라 컴파일러가 알아서 소멸자를 호출 시키기 때문에 '임시객체'라고 하는 것인가요? 강의에서는 그냥 벡터이기때문에 임시 벡터라고 한간가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
비트연산 시 unsigned...
부호를 없애야 >>를 해도 부호비트가 따라오지 않는다고 하셨는데 부호가 있는 경우(ex - 1100 0010)에 >>1을 실헝해본 결과 2로 나누어지는 것에 큰 이상은 없는 것 같았습니다...다른 이유가 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
functor질문 T질문
template <typename T> Item* FindItem(Item items[], itemCount, T selector) 이렇게 FindItem 의 시그니처가 구성이 되어있는데 T라는게 현재 어떠한 타입이든 올 수 있는 상황인데 Functor가 아니라 그냥 클래스를 만들어 놓고 저기다가 넣어주거나(operator ()를 오버로딩 하지 않은 클래스라던가) 그냥 일반 변수를 넣어주어도 일단은 통과가 되지 않나요?(컴파일 단계에서 에러가 나겠지만) (이런식으로) 그래서 궁금한게 C#에서는 제네렉 타입에 조건을 where로 걸어 줄수 있는데 현재 C#처럼 FindItem의 T타입을 class라고 c#처럼 where을 걸어 줄수는 없나요? ex) 신입이 왔는데 사진처럼 FindItem 마지막 인자에다가 기본 자료형 변수를 넣는 경우를 대비해서...
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
텍스트RPG #3 31:48 질문
EnterBattle(playerInfo, &monsterInfo[index]); 부분에 monsterInfo[index]는 배열이기 때문에 &는 없더라도 포인터와 상호적으로 주고받을 수 있기 때문에 오류가 안나야 된다고 생각하는데, 왜 오류가 발생하는지 모르겠스빈다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
nullptr 관련 질문
시드값을 정할 때, srand((unsigned) time(nullptr));라고 하였는데, 0 대신 nullptr을 쓴 이유가 있을까요? nullptr은 포인터와 함께 쓰여져야 하는 것 아닌가요???
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
8번 질문
당연히 보고 라이프 사이클이 생각나기는 했습니다. 그런데 스위치문을 빠져나와 delete p를 하면서 Archer의 소멸자 부분에서 스택에 잡혀있는 pet을 delete할려고하여 크래쉬가 나는 것인가요? (유효하지 않은 스텍 메모리를 delete할려고하여 생기는 문제인가요?) 아니면 delete라는 키워드는 힙메모리만 해제를 하는 키워드 이기 때문에 _pet이 가르키고있는 곳을 힙인지 아닌지 구별하고 힙이 아니라면 바로 크래쉬를 내는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
정렬 함수 만들기 관련 질문
정렬 함수 만드는 과정에서 Swap부분을 이용하는 대신 저는 참조를 사용하여 변형하고 싶었습니다. 보이는 사진처럼 진행하였으나 올바른 값이 나오지 않는데 왜 그런지 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
dynamic_cast 질문 18분
dynamic_cast가 상속관계에서 무조건 장점만 있는게 아니라고 하시면서 설명을 해주셨는데 타입변환 3 : 포인터에서 원래는 C스타일로 형변환 해주었다면 ItemType에 따라서 static_cast를 해주면 dynamic_cast를 사용하는 것보다 빠르다고 하셨는데 가삼함수 테이블 주소를 찾아서 그 주소에 맞게 형변환을 하는 것보다 사진처럼 if문과같은 코드들이 있는데 이러한 코드들을 거쳐서 static_cast을 하는것이 dynamic_cast보다 동작 방식이 더 빠른 것인가요? 왜 type따라서 미리 분류하여 static_cast를 하는것이 더 빠른가요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
17:50 포인터 배열 질문
int arr[3] = {}; 이것은 정수형 배열이라 전체 크기는 12바이트 이고 0번째 주소값을 4바이트로 크기를 할당한 것. int* arr2[3] = {}; 이것은 포인터 배열(정수형) 이고 0번째 주소부터 접근을 하면 그곳에는 정수형으로 해석할 주소값이 들어가있다라는 의미.(어떠한 정수형 데이터의 주소값이 있을 것.) 이렇듯 배열도 배열의 자료형 == 타입(크기)과 들어올 데이터의 자료형 == 타입(크기)이 일치 해야 하는데 이해가 안가는 부분이 현재 - Itme 클래스 크기sizeof(Item) = _itemType(4), _ ItemDbid(4), _dummy(4096) => 4104Byte - Weapon 클래스 크기sizeof(Weapon) = sizeof(Item) + _damage(4) => 4108Byte - Armor 클래스 크기sizeof(Weapon) = sizeof(Item) + _defense(4) => 4108Byte 이상태에서 rand값에 따라 switch 분기를 하여 1이 나왔을 경우 Item[0] = new Weapon를 해주게 되는데 이럴경우 아까 포인터 배열과 똑같이 해석을 하면 "0번째 주소부터 접근을 하면 그곳에는 Itme으로 해석할 주소값이 들어가있다라는 의미." 파생 클래스의 메모리 구조는 직렬형태라 [Item클래스 시작 주소값] [Weapon클래스 시작 주소값] 형태라 Weapon을 동적할당하여 Item 포인터 배열에 데이터를 넣을 수 있는 것 까지는 이해하였습니다. 그런데 4108바이트 짜리를 4104바이트로 해석을 한다는 의미이니 Item[0]->_damage = 10; 이렇게 값을 접근을 못하는것 아닌가요? (Weapon클래스의 _damage 부분이 짤렷으니) (추가적으로 접근을 한다면은 다른 메모리를 침범할 수 있는 메모리 오염이 발생) 그래서 타입변환 5 강의에서 다시 for 문안에서 nullptr체크를 해준다음에 ItemType에 따라서 (Weapon*)item; 이렇게 형변환하여 Weapon의 멤버 변수에도 접근을 할 수 있게 해준 것인가여요? 아니면 제가 아예 다르게 이해를 하고있는것인지 여쭤보고 싶습니다 :)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Wrong variable or address: "a"오류
안녕하세요 수강 중인 학생입니다. 8분 50초 즈음부터 시작하는 메모리 확인을 하다가 발견한 부분입니다. Address부분을 체크하지 않고 Value값을 확인하면 Wrong variable or address: "a"라는 오류가 뜹니다 체크를 하면 값이 확인이 되긴하는데 왜 저런 오류가 뜨는걸까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
빌드가 안됩니다 오류가 떠요
[22:39:17] Warning! Errors have occurred in the build: C:\Users\eunhyeok0226\AppData\Local\Temp\SASM\program.asm:46: error: parser: instruction expected gcc.exe: error: C:\Users\eunhyeok0226\AppData\Local\Temp\SASM\program.o: No such file or directory 이런식으로 오류가 계속 떠서 빌드가 안됩니다 ㅠㅠ 어떻게 해결 가능할까요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
[지역적 가치와 가치 강좌 질문]
6분 56초 처럼 왜 제 컴퓨터 내에서는 erc 레지스터가 존재하지 않을까요?? 선생님처럼 똑같이 작성했는데 말입니다..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
잉 [충고]편, 강의와 다름
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 강의에서는 int result = MultiplyBy(b, a); 부분을 어셈블리로 조사를 한다면, push부분이 나와야 하지만 나타나지 않고 대부분 어셈블리적힌 부분이 다른 거 같은데 왜 다른지 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터계산
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <iostream>using namespace std; int main(void){ int number = 1; int* ptr = &number; cout << &ptr << endl; cout << ptr << endl; cout << *ptr << endl; //*ptr += 1; //*ptr++; cout << *ptr << endl; }/* *ptr++;008D19AB mov eax,dword ptr [ptr]008D19AE add eax,4008D19B1 mov dword ptr [ptr],eax *ptr += 1;006419AB mov eax,dword ptr [ptr] 006419AE mov ecx,dword ptr [eax] 006419B0 add ecx,1 006419B3 mov edx,dword ptr [ptr] 006419B6 mov dword ptr [edx],ecx */ 궁금증이 생겨 여러 실험하면서, 어셈블리를 구경해봤습니다. ++, +=1 은 동일하게 1을 더할 때 사용한다고 배웠는데, 위와 같은 차이가 발생한 이유는 무엇인지 궁금합니다. (강의서 설명해주신 것처럼 1증가니까, 바구니 크기만큼 해서 4가 증가한 것으로는 이미 이해를 했습니다. ) (연산자 우선순위 상 문제가 있을 수도 있을 것으로 생각하여, 찾아봤습니다. *가 1순위, ++은 그 다음, +=은 제일 마지막이었습니다. 어떠한 경우든 *가 선이기 때문에 ++, += 의 영향은 없을 것이로 판단하였습니다. 이 생각에 오류가 있는지 궁금합니다.) 2. 저것의 결과는 *ptr++의 경우, -858993460이라는 수가 나왔는데, 이 이유를 잘 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
생성자 질문(타입 변환 생성자)
opertor를 공부하면서 생성자 부분이 궁금해서 테스트를 해보았는데 class Player{public : int m_iHp; int m_iAttack; int m_iDefense; public: Player() : m_iHp(100), m_iAttack(20), m_iDefense(5) { cout << "Player 기본 생성자!" << endl; } Player(int id) : m_iHp(200), m_iAttack(40), m_iDefense(10) { cout << "Player ID 받는 버젼 생성자!" << endl; } ~Player() { cout << "Player 소멸자!" << endl; }}; class Knight : public Player{public: int m_iStat; public: Knight() : m_iStat(10) { cout << "Knight 기본 생성자!" << endl; } Knight(int id) : Player(id), m_iStat(20) { cout << "Knight id 받는 버젼 생성자!" << endl; } ~Knight() { cout << "Knight 소멸자!" << endl; } }; int main(){ Knight k1; k1 = 3; return 0;} 현재 Knight k1을 만들게 되면은 콘솔창에 출력문이 이렇게 찍혀 햇갈리는 부분이 있어서 질문드립니다. 메모리를 확인해보니 k1의 주소(0x000000718D0FF688)는 이런값으로 안에 데이터들이 스택에 자리를 차지하게되어있었습니다. 이후 k1 = 3; 를 하게되면 Knight k1의 스택에 있는 주소가 가르키는 값들이 변경이 되는데 이는, 타입 변환 생성자(기타 생성자)를 통해 만들어진 객체를 만들어서 "암시적 형변환"으로 만들어진 객체를 대입연산자로 k1의 주소에 멤버 변수 하나하나를 다 덮어 쓴 형태인거같더라구요 즉, 정리하자면 1) Knight k1; 을 하는 순간은 스택에 기본 생성자를 호출 한 상태로 올라간다. 2) k1 = 3 하였을 경우, 컴파일러가 암시적 형변환으로 인자를 하나를 받는 Knight의 타입 변환 생성자(기타 생성자)를 호출한뒤 k1의 주소에 '=' 연산자를 통해 멤버 변수 하나하나를 덮어쓴다. (얕은 복사) 여기서 궁금한점이 소멸자를 출력하는 문장이 두줄에 걸쳐서 나오는게 아니라 이런식으로 4줄에 걸쳐서 나오는데 이게 분명히 암시적 형변환으로 생성한 객체를 생성하고 기본생성자로 만든 k1에 멤버 변수들을 덮어썻다고 생각해서 스택에는 Knight의 객체가 하나밖에 없는 상태로 봤는데 콘솔창을 확인하면 k1뿐만 아니라 k1 = 3을 하였을 때의 3에 해당하는 객체도 어딘가에 존재를 하는거 같은데 3이라는 정수를 컴파일러가 타입변환 생성자로 받아들여서 인자를 하나만 받는 Knight객체를 만들어서 '=' 연산자를 통해 k1에다가 멤버 변수를 다 덮어 씌우는데 정수 3을통해서 만들어진 객체도 스택에 올라간 다음에 값만 k1이라는 객체에 덮어 씌우는건가요..?? 맞는말인가요..???
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
C++과 C#의 클래스 객체 선언
(1. C# 문법입니다) public class Parent { protected virtual void Print() { Console.WriteLine("Parent Prnt!"); } public void CallFunc() { Print(); } } public class Child : Parent { protected override void Print() { Console.WriteLine("In Child!"); base.Print(); //Console.WriteLine("Child Prnt!"); } public void CallFunc() { Print(); } } 이런 클래스가 있다고 가정을 할때 C#에서는 Child c1 = new Child(); 이렇게 힙에 실제 객체를 올리고 new 연산자를 통해 (객체를 생성하고 생성자를 호출하는 키워드인 new연산자 사용) 힙에 올라간뒤 c1이 그곳을 가르키는 형태가 되어야 Child클래스 내에 있는 함수들을 사용할 수가 있는데 C++같은 경우에는 main 함수내에 Knight k1; 만 이렇게 선언해주어도 실제 설계도의 함수들을 사용할 수 있더라구요 이 이유가 그냥 C++는 C#과의 문법 차이로 C++에서는 객체를 만들때 new연산자를 사용하지 않고 Main 함수 내에서 Knight k1;만 해주면 클래스(실체) 스택에 올라가고 그냥 그녀석의 객체인 k1도 스택에 올라가는 것이고, C++에서 Knight* k2 = new Knight();를 해주어야 C#과 비슷한 형태인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
iterator 질문
안녕하세요 강사님 여기 코드에서 iterator begin() 이 부분이 어떻게 시작점 주소를 뱉어 줄 수 있엇나요? 질문하기 전에 종단점을 찍고 f11을 누르면서 찬찬히 살펴 봣는데 iterator부분의 생성자가 호출 되면서 빠져나오는데 이때 생성자에서 포인터 초기값을 해줘서 그런건가요? 만약에 이게 맞다면 iterator 클래스 생성자에서 초기화할 맴버변수가 많을때는 특정 값을 뱉어내기 힘들지 않나요??
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
생성자 소멸자와 관련해서 궁금한 것이 있습니다
루키스님 덕분에 어려웠던 c++ 공부에 흥미를 가지고 열심히 공부중인 학생입니다. 생성자와 소멸자에 관련한 영상을 보고 궁금증이 생겨 질문을 남기게 되었습니다! 첫번째 질문입니다) 클래스 내부에 생성자를 만들지 않는다면, 암시적으로 기본 생성자와 복사 생성자가 자동으로 만들어지는 것으로 알고있습니다. 그런데 생성자를 아무거나 하나 이상 만들면, 기본 생성자는 자동으로 만들어지지 않는데, 복사 생성자는 기본 생성자와 달리 다른 생성자의 유무와는 관계없이 자동으로 만들어 지는 것인지? 아니면 복사 생성자도 기본 생성자 처럼 아무 생성자가 하나 이상 있다면 자동으로 만들어지지 않는지 궁금합니다. 두번째 질문입니다) 강의를 보니 굳이 소멸자를 작성하지 않고 클래스를 만드시는 것을 봤는데, 그렇다면 클래스 내부에서 소멸자를 굳이 작성하지 않아도 자동으로 소멸자가 만들어지는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
11분 SetMessage 질문
main() { const char* msg = "Hello"; retrun 0; } Hello 라는 문자열이 수정이 불가능 한 이유로는 rodata영역에 들어가기 때문에 수정이 불가능하고 또한 const가 *이전에 붙어있어서 주소로 접근하여 값을 수정하는 것이 불가능하다. (msg라는 포인터 변수의 데이터(가르키는 주소는 수정이 가능하다) 그리고 SetMessage함수에 msg의 주소(값을)를 const char* a로 넘겨주고 a = "Bye"; 로 선언 및 초기화를 해주었을 경우 a는 const char* a 즉, a가 가르키는 값(주소)의 값(데이터 == Hello라는 문자열)수정이 불가능 한 것이지 a라는 포인터 변수가 담고있는 값부분(주소값)을 수정하는 게 불가능 한 것이 아니다. 따라서 SetMessage 함수가 호출되면 a라는 포인터 변수에 처음에 msg의 값에 담긴 "Hello"라는 문자열의 첫번째 주소값이 a에 담기기는 하지만, a = "Bye"로 인해 데이터 영역에 있는 "Bye"의 첫번째 주소가 a라는 포인터 변수의 값에 할당된다. 그리고 a라는 포인터 변수는 스택메모리에 쌓인다. SetMessage함수 호출이 종료되고 나면 a 포인터 변수 메모리 공간은 해제된다. (함수 호출이 종료되면 사용할 수 없는 포인터 변수이다) 제가 이해한것이 맞나요?? (추가로 SetMessage 함수에서 데이터 영역에 Bye"라는 문자열을 데이터 영역에 메모리만 추가를 하고, a가 가르키는 값은 해제가 되니까 결론적으로는 데이터 영역의 메모리만 잡아먹고 아무것도 안한셈이 되는 것인가요?)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
virtual을 붙이는 여부
안녕하세요 강사님 질문이 있습니다. 전에 다항성 수업에서 virtual 함수구현 할때 부모 클래스와 자식 클래스 가상함수에도 virtual 둘다 붙여 주셨고 마지막 text rpg에서도 Player와 Game 클래스에 소멸자에 virtual 을 붙여 주었습니다. 근데 이번에는 Player에만 virtual을 붙여 주셨는데요 그 이유가 뭔가요?