묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-I 코드 질문 있습니다!
강의의 코드에서 113번째 줄에 있는 visited[turn % 2][nx] = visited[(turn + 1) % 2][x] + 1; 거리를 구하는 것이 아니고 방문 여부를 파악하는 것이기 때문에 visited[turn%2][nx] = 1; 로 풀어도 된다고 생각하는 데 이것이 맞을까요? 만약에 아니라면 어떤 이유인지 궁금합니다!
-
해결됨홍정모의 따라하며 배우는 C++
생성자 호출 관련 질문
#include <iostream> #include <string> #include <vector> using namespace std; class Teacher { std::string m_name; public: Teacher(const std::string& name_input = "No name") : m_name(name_input) { std::cout << "Teacher" << std::endl; } ~Teacher() {} void setName(const std::string& name_in) { m_name = name_in; } std::string getName() { return m_name; } friend std::ostream& operator<<(std::ostream& os, const Teacher& teacher) { os << teacher.m_name << std::endl; return os; } }; class Student { std::string m_name; int m_intel; public: Student(const std::string& name_in = "No name", const int& intel_in = 0) : m_name(name_in) , m_intel(intel_in) { std::cout << "Student" << std::endl; } ~Student() {} void setName(const std::string& name_in) { m_name = name_in; } void setIntel(const int& intel_in) { m_intel = intel_in; } int getIntel() { return m_intel; } friend std::ostream& operator<<(std::ostream& os, const Student& student) { os << student.m_name << " " << student.m_intel; return os; } }; class Lecture { std::string m_name; Teacher m_teacher; std::vector<Student> m_students; public: Lecture(const std::string& name_in = "No Name") : m_name(name_in) { std::cout << "Lecture" << std::endl; } ~Lecture() { //do Not delete teacher, students } void assignTeacher(const Teacher& teacher) { m_teacher = teacher; } void registerStudent(const Student& const student) { m_students.push_back(student); } void study() { std::cout << m_name << " Study " << std::endl << std::endl; for (auto& element : m_students) element.setIntel(element.getIntel() + 1); } friend std::ostream& operator<<(std::ostream& os, const Lecture& lecture) { os << "Lecture name : " << lecture.m_name << std::endl; os << lecture.m_teacher; for (auto& element : lecture.m_students) os << element << std::endl; return os; } }; int main() { using namespace std; Lecture lec1("Introduction to Computer Programming"); lec1.assignTeacher(Teacher("Prof. Hong")); lec1.registerStudent(Student("A", 1)); lec1.registerStudent(Student("B", 2)); lec1.registerStudent(Student("C", 3)); Lecture lec2("Computational Thinking"); lec2.assignTeacher(Teacher("Prof. Good")); lec2.registerStudent(Student("A", 0)); //TODO. implement Aggregation Relationship //test { cout << lec1 << endl; cout << lec2 << endl; lec2.study(); cout << lec1 << endl; cout << lec2 << endl; } } Lecture를 생성하면 Teacher도 같이 생성됩니다 그런데 Lecture 생성자 안에 Teacher와 관련된건 없을텐데 생성되니깐 궁금해서 질문합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
굳이 locale을 설정해야 하는 이유가 있나요?
유니코드 관련해 질문이 있습니다! UTF16 방식이 2바이트에 각종 문자를 할당하는 것이라면, 한글에도 문자 하나하나에 2바이트 크기의 어떤 고유한 데이터가 할당되어 있는 것이라고 이해했습니다. 그런데 이러면 굳이 왜 locale("kor")을 해야하는 것인지 의문이 듭니다. wchar_t와 L을 쓰면, 이 데이터가 유니코드이면서 utf16 방식임을 충분히 알려준 것 아닐까요..? 그러면 데이터를 보고 이것이 한글임을 바로 알 수 있지 않나요??
-
해결됨홍정모의 따라하며 배우는 C++
head guard가 있는데도 cpp 파일에서 body가 정의되면 에러가 뜨는 이유
따배씨를 듣고 곧바로 C++을 듣고 있습니다. 실험을 해보다 신기한 결과가 나오는데 해석이 되지 않아 질문을 남깁니다. add 함수는 add.header 파일에서 선언을 하고 add.cpp 파일에서 body를 정의하였습니다. global.h 내에 정의되어 있는 함수 print_global()은 header 파일에 Body를 정의하였습니다. 이 함수로 에러를 발생시킬 것이며 header guard가 잘 작동하는지 확인하기 위해 실험할 것입니다. global.h 함수에서 #pragma once와 #ifndef-#define으로 헤더가드를 만들면 서로 다른 cpp파일이 호출하여도 에러가 발생하지 않을거라 예상하고 실행하였습니다. // add.h #pragma once #ifndef __ADD #define __ADD int add(int a, int b); // Forward declaration, Prototype #endif // add.cpp #include "global.h" int add(int a, int b) // Definition { print_global(); return a + b; } // global.h #pragma once #ifndef __GLOBAL #define __GLOBAL #include <iostream> void print_global() { std::cout << __func__ << "is executed!" << std::endl; } #endif // !__GLOBAL // main.cpp #include "add.h" #include "global.h" int main() { print_global(); std::cout << add(1, 2) << std::endl; } 링크에러는 add.obj에서 발생하였습니다. header guard가 있어서 링크 에러가 발생하지 않아야 할 거 같은데 무슨일인지 이해가 되지 않습니다. add.cpp 파일을 지우고 add.h 헤더파일안에 함수의 Body를 넣으면 링크에러가 발생하지 않습니다. #pragma once #ifndef __ADD #define __ADD #include "global.h" int add(int a, int b) // Definition { print_global(); return a + b; } #endif 따라서 header guard가 header 파일 내부에서 정의되었더라도 cpp파일에서 #include 전처리 지시자를 사용해서 해당 header를 복사-붙여넣기 해버리면 header guard가 무용지물이 되어버린다는 가정을 세웠습니다. 제 가정이 맞나요? cpp파일에서 header guard는 작동하지 않는다는 가정이 맞나요? 왜 그런지 잘 모르겠습니다. header 파일은 link 없이 #include 전처리지시자로 동작하지만 cpp 파일은 obj로 만들어 linker가 연결해주기 때문에 전처리지시자가 아무 역할을 하지 못하는거 같습니다.
-
미해결홍정모의 따라하며 배우는 C++
객체의 사라지는 시점에 관한질문
지금까지 공부한 내용을 바탕으로 보면 객체는 생성된 괄호 안에서만 존재하고 괄호를 벗어나면 사라진다 라고 배웠습니다. 익명객체는 줄이끝나면 바로 없어지고요 근데 드는의문점이 있는데요 위의 코드에서처럼 객체의 소멸시점에 대해 실험해봤는데 실행결과만 보면 객체의 매개변수등의 정보들이 메모리에 여전히 저장되어 있는것처럼 나옵니다. 저 값들은 말그대로 os에 반납된 메모리라 언젠간 다른 데이터로 인하여 덮어질 예정인 값들이 맞죠? 저 mon1 이라는 객체는 말그대로 없어진것이 맞는지 궁금합니다. 만약에 없어진 것이 맞다면 예를들어 mon1 안에 Position2D 타입의 객체를 생성하는 구문이 있을때 이 생성된 객체도 없어지는것이 맞죠?
-
미해결[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++
이것도 선택정렬 이라고 볼 수 있나요?
안녕하세요, 이제 뭔가 뚝딱뚝딱 해야 할것들이 늘어나는 것 같아서 점점 재밌어지네요. 머리도 복잡한건 덤 :) 교수님이 먼저 진행 하시기 전 먼저 구현을 해보라고 했을때 코드 짜본건데 결과적으로는 잘 정렬이 되었습니다. 혹시나 해서 배열 크기를 10으로 잡고 했는데도 결과는 1~10까지 오름차순 으로 잘 되었는데요, 교수님이 하신거랑 제가 한거랑 비교했을 때 차이가 크더라구요. 혹시 이것도 제대로 선택 정렬을 한 것이라 봐도 될까요? 디버깅으로 찍어봐도 제가 지금 헷갈려서 그런건지 이해가 좀 어려운것 같아요. 아래쪽 코드는 내림차순으로 나온건데 같이 첨부해 봅니다. 감사합니다. const int length = 5; int array[length] = { 3, 5, 2, 1, 4 }; cout << "current array: "; printArray(array, length); int swap = 0; for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { if (array[i] < array[j]) { swap = array[i]; array[i] = array[j]; array[j] = swap; } //cout << array[j] << " "; } printArray(array, length); } // 5 4 3 2 1 /*for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { if (array[i] > array[j]) { swap = array[j]; array[j] = array[i]; array[i] = swap; } cout << array[j] << " "; } cout << endl; }*/
-
미해결홍정모의 따라하며 배우는 C++
Overflow 출력 관련 질문
안녕하세요. 항상 좋은 강의 감사드립니다. 실습을 진행 중 궁금한 사항이 있어 질문을 올리게 되었습니다. #include <iostream> #include <limits> short s = std::numeric_limits<short>::max(); cout << "max + 1: " << ss + 1 << endl; cout << "max + 2: " << ss + 2 << endl; s += 1; cout << "max + 1: " << ss << endl; 위 코드를 출력하면 다음과 같이 출력됩니다. max + 1: 32768 max + 2: 32769 max + 1: -32768 수의 최대 범위가 넘어갔는데도, 출력을 할 때 더 큰 수가 출력이 되는 이유가 변수에 저장을 안해서 그런 것 인가요? L-value와 R-value와 관계가 있는 것인지 궁금합니다. 감사합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
맥북에서 VS로 C++은 안되는건가요??
맥 사용자인데 부트캠프로 윈도우로 변경 후 강의를 듣고있습니다! 원래대로 맥북을 이용해서 듣고싶은데 강의 자체도 윈도우고, 검색을 해보니 맥은 VS로 C++은 지원 하지 않는다고 봐서 VScode를 이용해야 한다던데, 엄연히 VS와 VScode는 다른걸로 알고있어서 그냥 윈도우 상태로 강의를 듣는게 낫겠죠?? 언리얼엔진까지 공부할려고 하는데 그냥 윈도우로 가는게 좋을지 조언 부탁드립니다!
-
미해결홍정모의 따라하며 배우는 C++
13:49 if(!mptr)질문드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이미 주소를 가지고 있으면 지우는것이기때문에 if(m_ptr) delete m_ptr ; 이 맞지않나요? if(!m_ptr) delete m_ptr 하면 m_ptr이 nullptr일때 지우는게 아닌가 해서 질문드립니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
이것도 데이터 누수라고 볼 수 있나요?
Pet() Pet(const Pet&) Pet() Pet(const Pet&) ~Pet() ~Pet() ~Pet() 깊은 복사 구현후 실행하면 생성자 4번, 소멸자 3번 출력되는데 Knight knight3; 때 생성된 Pet()이 knight3 = knight 때 복사 대입 연산자에서 생성된 pet으로 대체 되잖아요. 그래서 하나의 pet이 소멸이 안된 건가요? 이정도 데이터 누수는 괜찮은 건가요? 이것도 관리해 줘야 하나요?
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
39.번에는 p1,p2,p3를 1로 초기화하셧는데
40번에는 p1,p2,p3를 0으로 초기화한 이유는 sort(a.begin(),a.end()) 때문인가요??
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
visual studio 설정
visual studio 사용하시는걸 보면 클래스나 변수 함수 다 기본 설정이 아닌데 따로 설정하시는 룰 같은게 있으신지 궁금합니다. 제가 따로 설정해보려해도 뭘 설정해야 원하는게 바뀌는지 찾기가 쉽지 않아서요 알려주실 수 있나요?
-
해결됨홍정모의 따라하며 배우는 C++
함수 출력 값
아래 함수를 출력하면 7이 나와야 할거 같은데... 1이 출력이 됩니다... namespace work3::work33::work3333 //컴파일러 버전 17적용해야됨 { int a(1); void doSomething() { a += 6; } } int main() { work3::work33::work3333::a; work3::work33::work3333::doSomething; cout << work3::work33::work3333::a << endl; cout << work3::work33::work3333::doSomething << endl; }
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
멤버 함수 포인터 질문입니다.
함수 원형 선언같은 경우는 정의는 밑에 있고 맨위에 원형만 선언해주면 이 함수를 쓸거니까 알아둬라 이런 의미로 넘어가는걸로 알고있는데 typedef int(Knight::*PMEMFUNC)(int, int); 이 구문은 왜 그렇게 넘어가질 않는지 궁금합니다
-
해결됨홍정모의 따라하며 배우는 C++
정렬을 했는데 방법이 특이합니다.
이렇게 코드를 작성했는데 교수님께서 작성하신거랑 비슷하면서 결과가 많이 다름니다... 어떤 점이 틀린건가요?? #include <iostream> using namespace std; void printArray(int* array, int length) { for (int i = 0; i < length; i++) cout << array[i] << " "; cout << endl; } int main() { const int length = 5; int array[length] = { 3,5,2,1,4 }; printArray(array, length); for (int i = 0; i < length; i++) { for (int j = 0; j < length-1; j++) { if (array[i] < array[j]) { int k = array[i]; array[i] = array[j]; array[j] = k; } } printArray(array, length); } return 0; }
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
C++ 11관련) for range(범위기반 for문)을 따로 안다루셨는데 이유가 있으신지 궁금합니다!
이전에 파이썬, C를 보다가 이번에 C++을 처음 접하게 된 한 수강생입니다! 현재 강의 5개 빼곤 다 들어서 오늘, 내일쯤 완강을 앞두고 있는데요. for range 관련해서 기존에 쓰던 파이썬의 for문과 비슷해서 친숙(?)하다고나 할까 그래서 이 문법을 좀 써보려고 하는데 이 강의에선 따로 다루시지 않아서 혹시 다루지 않으신 이유가 있는지 궁금합니다! 만약 이유라면 성능상의 문제라던지 가독성의 문제 혹은 기존 프로그래머분들이 많이 사용하지 않는 문제 등등이 있을 것 같은데 실제로 그런 것인지 rookiss님의 의견이 궁금합니다!!
-
미해결홍정모의 따라하며 배우는 C++
public에 Fraction()을 만드는 이유...
public에 Fraction()을 만드는 이유가 private 에서 int m_numerator = 0; , int m_denominator = 1; 처럼 기본값을 넣을 수 있으나, 이 값을 바꾸기 위해서 생성자를 사용한다고 하셨는데, private에서 int m_numerator = 2; 와 같이 직접 바꿀 수도 있지 않나요?
-
미해결홍정모의 따라하며 배우는 C++
연습문제) 피보나치 수열함수 구현
대학교 1학년때 C++ 배울 때 숙제로 재귀함수로 피보나치 수열을 구현하다가 많은 어려움을 겪었던 기억이 있습니다.이번에 구현할 때 약간 애를 먹었지만 수열들이 어떻게 구성되는지 원리를 파악해보니 생각보다 쉽게 되었습니다.특히 제가 성장했다 느낀 부분은 저번에 배운 함수 포인터를 스스로 먼저 활용하겠다고 생각해 출력 부분을 함수 포인터를 인자로 받아 활용했다는 것에서 제가 성장했다 느꼈습니다. 강의를 통해 많은 도움들을 받고, 자신감을 얻어가고있습니다. 강의를 제작해주신 홍정모 교수님과 답변해주시는 분들께 진심으로 감사드립니다.
-
미해결홍정모의 게임 만들기 연습 문제 패키지
랜덤값 질문입니다.
글 작성이 제대로 안되서, 코드에 대한 설명이 미흡할 수 있는 점 미리 양해구합니다.ㅠㅠ 저는 집 색깔을 랜덤으로 정할 때, 기본값이 미리 정해져 있는 상태에서 사용자가 특정 부분만 색깔을 랜덤으로 돌릴 수 있도록 함수를 작성했습니다. 아래와 같은 두가지 함수를 실험삼아 해봤는데요. 첫번째 함수는 랜덤값을 불러오는 헤더를 외부에서 매개변수로 가져오고 두번째는 함수 안에다가 선언했습니다. 그런데, 두번째 함수는 랜덤값이 다 같게 적용이 되더군요. 분명 랜덤값은 _rnd.getInt(0,6);에서 가져올텐데 왜 두개의 함수의 결과가 다른지 이해가 가지 않습니다.ㅠㅠ 제가 분명 기본이 부족한 거일 수도 있겠지만, 인터넷 검색으로도 썩 답변이 안되어 질문글 올립니다. 감사합니다.