월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C++
int (*fncptr)() = func; 가 잘 이해가 되지 않습니다.
처음에 func()을 선언하고 정의해주신 다음에cout << func <<endl;을 해주니까 저의 경우에는 1이 출력이 되던데 아마 추리해보자면 true false 여부를 출력해주는거 같다는 느낌입니다. 저는 vscode를 이용하는 중입니다. 3:42초 경에 있는 int (*fncptr)() = func; 가 이해가 안돼서 직접 타이핑을 해봤는데 int *fncptr() = func; 처럼 괄호를 치지 않으면 에러가 나던데 어떤 동작 원리에 의해서 에러가 나는 건지 이해가 되지 않습니다. 그냥 원래 정해진 규칙인가요?
- 해결됨홍정모의 따라하며 배우는 C++
Derivec class -> Base class 형변환
안녕하세요! Derived 객체에서 Base class로의 형변환 과정이 궁금해져서 질문을 남깁니다!참고로 VS2022 를 사용하였습니다.#include <iostream> using namespace std; class Base { protected: int m_i; public: Base(int value) : m_i(value) { cout << sizeof(*this) << endl; } friend std::ostream& operator << (std::ostream& out, const Base& b) { out << &b << endl; out << "This is base output" << endl; return out; } }; class Derived : public Base { private: double m_d; public: Derived(int value) : Base(value) {} friend std::ostream& operator << (std::ostream& out, const Derived& d) { // derived는 base의 memory를 갖고 있기 때문에 가능함. out << static_cast<Base>(d); out << "This is derived output" << endl; return out; } }; int main() { Derived derived(7); cout << &derived << endl; cout << sizeof(derived) << endl; cout << derived << endl; return 0; } 먼저 class가 차지하는 size를 sizeof로 확인한 결과 Base는 4bytes, Derived는 16bytes(padding)으로 나왔습니다.그다음 디버거를 통해 Derived의 주소를 통해 메모리에 들어있는 값을 확인한 후 Base의 연산자 오버로딩으로 넘어간 static_cast<Base> (d)의 주소를 들어가봤습니다.(위에 빨간 줄이 Base << 로 넘어간 후 static_cast<Base> (d)의메모리, 아래는 derived의 메모리)결과 base << 는 reference로 받기 때문에 원본을 받아야하는데 주소가 다르게 나오고 값이 복사된 것을 확인할 수 있었습니다. 이 과정에서 어떤 부분이 복사하도록 관여한 것일까요?한 가지 추측으로는 static_cast<>가 내부적으로 복사한 값을 base의 <<로 보내는 것이 아닌가 생각합니다!
- 해결됨홍정모의 따라하며 배우는 C++
Buffer overrun 관련해서 질문드립니다!
안녕하세요! 항상 양질의 강의와 질문 커뮤니티 덕분에 많이 배우고 있습니다!강의에 나온 클래스를 직접 구현해봤는데요, 생성자 코드에서 m_data element를 초기화하는 과정에서 buffer overrun이 발생합니다.IntArray(const initializer_list<int>& list) //: IntArray(list.size()) { m_data = new int[list.size()]; m_length = list.size(); initialize(); int count = 0; for (auto& e : list) { m_data[count] = e; // buffer overrun 발생 count++; } }그래서 다른 분의 코드를 참고하여 다음과 같이 수정하였습니다.IntArray(const initializer_list<int>& list) : IntArray(list.size()) { /*m_data = new int[list.size()]; m_length = list.size(); initialize();*/ int count = 0; for (auto& e : list) { m_data[count] = e; // buffer overrun 발생 count++; } } 수정 후 buffer overrun이 사라졌는데 debugger를 돌려도 똑같이 작동하는 거 같아 어디서 잘못됐는지 찾기가 어렵습니다ㅠㅠ그 이유를 알고싶습니다,,아래는 전체 코드입니다.#include <iostream> #include <initializer_list> using namespace std; class IntArray { private: int m_length = 0; int* m_data = nullptr; public: IntArray(const int& length_in = 0) : m_length(length_in) { m_data = new int[m_length]; initialize(); } IntArray(const IntArray& arr) : IntArray(arr.m_length) {} IntArray(const initializer_list<int>& list) //: IntArray(list.size()) { m_data = new int[list.size()]; m_length = list.size(); initialize(); int count = 0; for (auto& e : list) { m_data[count++] = e; // buffer overrun 발생 } } ~IntArray() { delete[] m_data; } void initialize() { for (int i = 0; i < m_length; i++) m_data[i] = 0; } void reset() { delete[] m_data; m_data = nullptr; m_length = 0; } void resize(const int& new_length) { int* temp = new int[new_length]; for (int i = 0; i < (new_length < m_length ? new_length : m_length); i++) temp[i] = m_data[i]; delete[] m_data; m_length = new_length; m_data = temp; } void insertBefore(const int& value, const int& ix) { if (ix >= 0 && ix < m_length) { resize(m_length + 1); for (int i = m_length - 1; i > ix; i--) m_data[i] = m_data[i - 1]; m_data[ix] = value; } else cout << "Invalid index" << endl; } void remove(const int& ix) { if (ix >= 0 && ix < m_length) { for (int i = ix; i < m_length - 1; i++) m_data[i] = m_data[i + 1]; resize(m_length - 1); } else cout << "Invalid index." << endl; } void push_back(const int& value) { resize(m_length + 1); m_data[m_length - 1] = value; } IntArray& operator = (const std::initializer_list<int>& list) { resize(list.size()); int count = 0; for (auto& e : list) { m_data[count] = e; count++; } return *this; } IntArray& operator = (const IntArray& arr) { if (this == &arr) return *this; delete[] m_data; m_length = arr.m_length; if (arr.m_data != nullptr) { m_data = new int[arr.m_length]; for (int i = 0; i < arr.m_length; i++) m_data[i] = arr.m_data[i]; } else m_data = nullptr; return *this; } friend ostream& operator << (ostream& out, const IntArray& arr) { for (int i = 0; i < arr.m_length; i++) out << arr.m_data[i] << " "; return out; } }; int main() { IntArray my_arr{ 1, 3, 5, 7, 9 }; cout << my_arr << endl; my_arr.insertBefore(10, 1); cout << my_arr << endl; my_arr.remove(3); cout << my_arr << endl; my_arr.push_back(13); cout << my_arr << endl; // containter : ~가 ~의 member다. return 0; }
- 미해결홍정모의 따라하며 배우는 C++
6.17 for each 강의에서 질문있습니다.
for each를 이용하여 간단하게 최댓값을 구하는 방법을 알고, 함수를 사용하여 구현해보면 좋겠다고 생각하여 코드를 짜보았습니다. 함수의 입력으로 배열을 매개변수로 넣었는데 오류가 떴습니다.비슷하게 vector를 이용하여 매개변수 인수로 넣어보니 잘 작동하였습니다.이유가 무엇일까요?
- 미해결홍정모의 따라하며 배우는 C++
string& 과string 차이
8.9 클래스와 const 14분에서 클래스 메소드를 만들때 const string& getValue() 나string& getValue() 이런식으로 선언하셨는데그냥 string getValue() 와 무슨 차이가 있는지 궁금합니다..
- 미해결홍정모의 따라하며 배우는 C++
링크 에러 질문입니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 다음과 같이 코드를 작성하면 Error LNK1169 one or more multiply defined symbols found Error LNK2005 "double Constants::pi" (?pi@Constants@@3NA) already defined in main.obj Chapter4_3 다음과 같은 에러들이 뜨는데요, constant.h 의 pi값을 const값으로 정의해주면 잘 돌아갑니다. const로 정의했을때와 const없이 변수로 정의했을때 왜 저러한 차이가 발생하는지 궁금합니다!
- 미해결홍정모의 따라하며 배우는 C++
5:59 friend로 처리하는 부분에 질문이 있습니다.
friend로 함수 처리를 하시면서 하신 말씀이불편함을 조금더 없애기 위하여 파라미터의 getCents()를 안통하게 하기위해 friend로 함수 처리를 하면된다고 하시는데friend로 처리를 하나 안하나 똑같이 작동하며 아래 출력 코드에서 고친것이 하나도 없으신데 getCents()를 안통한다고 하신것이 이해가 안가 질문을 드립니다처음에는 getCents()를 쓰는것이 코드가 길어보이고 귀찮으니까 코드를 줄이기위해 getCents()를 제거하기위해 하신줄 알았습니다.operator + 함수 내부의 return 코드를return Cents(c1 + c2); 처럼요.
- 미해결홍정모의 따라하며 배우는 C++
소멸자에서 동적할당 메모리 반환시 문제
#include <iostream>#include <string>using namespace std;int cccccount = 0;class samplee{int member;public :samplee(){};~samplee(){cout << ++cccccount << endl;delete this; }};int main(){ { samplee *abc = new samplee; samplee(); }return 0;}ccccount 가 10497 정도 까지 올라가는데 왜그런건가요?
- 해결됨홍정모의 따라하며 배우는 C++
멤버변수와 생성자의 관계 질문
마지막질문 멤버변수에서 초기화를 하지 않으면 멤버변수가 선언될때는 메모리를안받고(쓰레기값도 저장안됨)멤버변수가 메모리를 받는곳은 생성자부분인가요?
- 해결됨홍정모의 따라하며 배우는 C++
연습문제 질문있습니다.
IntArray& operator = (const std::initializer_list<int>& list) { cout << "Assignment operator " << endl; delete[] m_data; m_length = list.size(); m_data = new int[m_length]; int count = 0; for (auto& element : list) { m_data[count] = element; ++count; } return *this; }연습문제로 이렇게 짜봤는데 m_data[count] = element; 부분에서 buffer overrun이 발생한다고 나옵니다. 그런데 IntArray(const std::initializer_list<int>& list)를 만들 때도 똑같은 코드가 쓰였는데 이때는 왜 에러메시지가 발생하지 않았는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
extern 사용법 및 clang error
안녕하세요맥OS에서 vscode를 가지고 실습하고 있습니다.지난 번에 헤더파일 만드는 강의에서도 그렇고 이번에도 코드 실행(run) 시 아래와 같은 에러가 납니다.빌드에서도 유사한 에러가 나서, tasks.json파일에서 빌드대상을 ${file}에서 ${fileDirname}/*.cpp 로 변경하여강의에서 extern void doSomething에 사용된 cpp파일을 함께 빌드하면서 해결했습니다.그런데 빌드 후 코드 실행을 하면, 여전히 해당 에러가 발생하더군요...근데 이걸 main이 있는 곳에서 doSomething이 정의된 cpp파일을 include해야 에러 없이 동작합니다.질문의 요지는... extern이 해당 폴더(?)에서 doSomething을 찾아서 링킹 해주는 것이고 강의에서는 include하지 않고도실행이 잘 되던데, 왜 저는 include를 해야하는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
9.12 이니셜라이져 리스트
안녕하세요, 강의를 들었는데 정확히 이해한 것인지 모르겠어서 질문합니다. 1) 강의 5분 50초쯤에 이니셜라이저 리스트의 element 수를 늘려도 상관없다고 말씀하신 이유가,생성자를 만들 때 깊은 복사를 하도록 만들어주었기 때문인가요?아니면 깊은 복사가 아니라, 위임 생성자 IntArray에 list.size()로 인자를 보내서 동일한 주소m_data를 사용하고 크기만 바꿔주었기 때문인가요..? 2) 강의 2분 20초쯤에 소멸자를 보면~IntArray() { delete[] this->m_data; }이렇게 되어 있는데 여기서 this->를 써주는 이유가 있나요? 저는 delete[] m_data;로 써도 된다고 생각했는데 제가 놓친 이유가 있는지.. 궁금합니다.
- 해결됨홍정모의 따라하며 배우는 C++
1:20 부근 질문 있습니다
교수님께서 const는 붙일 수 있으면 붙이는게 좋다는 말씀을 하셨는데요 이전 강의인 산술 연산자 오버로딩과 입출력 연산자 오버로딩에서는 const를 붙이지 않다가 이번 단항 연산자 오버로딩에서는 const를 붙이신 이유가 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
9.1 산술 연산자 오버로딩
안녕하세요, 양질의 강의에 감사하며 수강하고 있습니다. 강의 1:40쯤 getCents()함수를 2개 만드는데요,int getCents() const { return m_cents; } int& getCents() { return m_cents; }아래 참조형 반환 함수는 왜 만든 건가요?이번 강의를 끝까지 봤는데도 어떤 용도로 사용되었는지 잘 모르겠습니다.(강의에 따르면 <클래스 외부 함수에서 클래스의 private멤버 변수에 접근하기 위한 방법>을 생각하면서 나온 듯한데.. 잘 모르겠습니다.)
- 해결됨홍정모의 따라하며 배우는 C++
산술연산자 오버로딩에 대해서 질문있습니다.
사용자 정의 자료형에 산술 연산자를 정의해주는 것까지는 알겠는데 이게 어째서 산술 연산자 overloading이라고 불리는지 모르겠습니다. 다른 매개 변수를 가진 같은 이름의 여러 함수를 정의하는게 overloading 아닌가요?
- 미해결홍정모의 따라하며 배우는 C++
link error가 나는데 이유를 모르겠습니다.
<EX.cpp> <main.cpp> 이렇게 하고 하는데 링커 에러가 납니다.근데 EX.cpp 내용을 똑같이 헤더에 넣으면 또 돌아갑니다.헤더파일에 #pragma once가 선언되어있어서 되나 싶긴 한데, 또 그렇다기에는 EX.cpp에서 중복으로 선언되는 부분은 없는 것 같아서 어디서 문제가 발생한건지 잘 모르겠습니다...
- 미해결홍정모의 따라하며 배우는 C++
컴파일시 궁금점
교수님 안녕하세요컴파일 단계에서 궁금점이 있습니다c/cpp 파일을 컴파일하게 되면.obj 파일로 바로 번역되는 것인가요? 어셈블리어라는게 있으니까 어셈으로 번역되고 .obj 파일로 번역되는게 아닌가 하는 생각을 해봣습니다.(정확한 내용은 아니지만 컴파일러에 어셈블러가 포함되어있다 는 이야기도 본 적이 있는 듯 합니다)이 내용을 알게되더라도 제가 뭘 할 수있는 것은 아니라서 중요한 질문이 아니라고 생각하지만 그냥 궁금해서 여쭤보았습니다.
- 해결됨홍정모의 따라하며 배우는 C++
FruitType이 private이면 어떻게 초기화시키나요?
이번 강의에서는 생성자 parameter로 FruitType 변수를 받고 있는데 만약 FruitType이 private이면 main()에서 어떻게 초기화를 시킬 수 있나요?
- 미해결홍정모의 따라하며 배우는 C++
정적 동적 구분
정적할당과 정적변수는 다른개념의 정적인가요?메모리의 크기를 런타임으로 할당받고 안받고의 차이가정적,동적 할당의 차이라고 이해합니다(아직은요..!)근데 정적변수는 메모리는 정적으로 할당이 되어있는데메모리에 저장되있는 데이터가 정적이라는 말인건가요?
- 미해결홍정모의 따라하며 배우는 C++
2.6 불리언 자료형과 조건문 if 질문 있습니다
강의 코드 따라서 수업듣고 있었는데, 저같은 경우 true를 입력했더니 true가 아닌 false가 나옵니다.왜 이렇게 나오는 건지 의문이 들어서 질문 올립니다..!