월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C++
friend에 관한 질문 드립니다!
강의 8:25 에서 friend void B::doSomething(A& a); 가리키시면서 B안에 doSomething이 있다는 것을 class A가 알 방법이 없다고 하셨는데, friend void B::doSomething(A& a); 이 문구 자체가 B안에 doSomething이 있다는것을 알려 주는게 아닌가요? B::doSomething(A& a) 저는 이 문구를 B안에 doSomething가 있다 이렇게 이해를 하게 되는데요. 이렇게 이해하면 안되는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
Team Explorer에서 Solutions 탭 만드는 방법
(질문 아님)Team Explorer에서 Solutions탭이 안보이는 것을 해결하는 방법. Visual Studio 2019 version 16.8 이상에선 Team Explorer에서 Solutions이 보이지 않습니다. - 해결방법 Tools>Options>Environment>Preview Features 에서 New Git user experience의 체크박스를 해제하면 됩니다. 강의를 따라가다가 Solutions이 안보여서 엄청 당황했었네요.. 다들 참고하세요!! 나중에는 visual studio에서 추구하고자 하는 방향을 따라가는 것이 맞겠지만.. 우선 강의는 들어야하지 않겠습니까~? 다들 즐거운 TBC 공부 되세요!
- 해결됨홍정모의 따라하며 배우는 C++
함수
int dosomting(int x) { return ++x; } int dosomting1(int x) { cout << ++x << endl; } int main() { int x = 4; cout << dosomting(x) << endl; //5 dosomting1(x); //5 cout << x << endl; //4 } 함수에 매개변수를 넣게 되면 변수가 복사가 되어서 값을 바꾸어도 본래의 값에는 영향을 미치지 않는다는 것을 알고 있습니다. 하지만 출력시켰을 때가 조금 헷갈립니다. 출력을 하게 되었을 때는 값이 바뀌어서 나왔습니다. main의 x와 다른것인것인 return값이 나오는 것같은데 main의 x와는 관련이 없는것인가요? dosomting과 dosomting1이 작동하는 방식이 같은 것인가요?
- 미해결홍정모의 따라하며 배우는 C++
MyConstant.cpp 에선 헤더파일 없이 값에 접근할 수 있었던 이유가 궁금합니다.
MyConstant.cpp 가 Main.cpp 나 Test.cpp 처럼 헤더를 include 하지 않고도 값을 선언할 수 있었던 이유가 궁금합니다. 그리고 MyConstant.cpp 의 namespace 가 MyConstant.h 의 namespace와 같은 공간인지 궁금합니다.
- 해결됨홍정모의 따라하며 배우는 C++
다중포인터의 메모리
코드2 배열의 주소를 찍어봤을 때 4씩 늘어나는 것을 볼 수 있었습니다. 코드3 이중포인터를 사용한 배열의 주소를 찍어봤을 때 8이 늘어나는 것을 볼 수 있었습니다. 코드 4 행렬의 주소를 찍어봤을 때 열은 4씩 늘어나고 행은 20이 늘어난 것을 볼 수 있었습니다. 주소를 저장하는 공간은 정해져있는 것으로 알고 있는데 첫번째 코드의 경우 8이고, 두번째 코드의 경우 4이고 3번째 경우에는 8이며 네번째 코드의 경우는 다음 행과의 차이가 20인가요 잘못 비교를 하고 잇는 것같은데 뭐가 문제일까요 이중포인터 배열을 만들고 배열을 만들때의 메모리가 어떻게 할당이 되는지 궁금합니다. 그림을 그려서 이해해보려하는데 잘 안됩니다. 2차원 배열이라서 메모리 주소로 이해를 하면 안될 것 같은데 어떻게 생각하면 될까요? cout << sizeof(int *) << endl; //8 -------------------------------------1 int *matrix = new int[3]; cout << matrix << endl; //0x...20 cout << &matrix[0] << endl; //0x...20 cout << &matrix[1] << endl; //0x...24 -------------------------------------2 int **matrix = new int *[3]; cout << matrix << endl; //0x...20 cout << &matrix[0] << endl; //0x...20 cout << &matrix[1] << endl; //0x...28 -------------------------------------3 int **matrix = new int*[3]; for(int r=0; r<3; r++) matrix[r] = new int[3]; cout << &matrix[0][0] << endl; //0x..40 cout << &matrix[0][1] << endl; //0x..44 cout << &matrix[1][0] << endl; //0x..60 --------------------------------------4
- 해결됨홍정모의 따라하며 배우는 C++
주소 크기관련 궁금한게 있어서 여쭤봅니다
21분쯤에 64bit 컴퓨터에서 sizeof(&변수) 를 할 시 8byte 크기가 나왔습니다 그래서 궁금해서 크기가 2인 int형 배열을 선언 한 후에 각각의 주소를 출력해보니 차이가 4가 나더라구요 그렇다면 주소의 크기는 변수 사이의 간격?과는 별 상관 없다고 보는게 맞는건가요?
- 해결됨홍정모의 따라하며 배우는 C++
[2:40] string 에 대해 음수로 resize 하는 경우
강의에서와 같이 -1로 resize를 하면 "string too long" 라고 exception이 출력됩니다. 관련하여 본 강의에 대해 질문 및 답변 내용을 보면 함수의 parameter가 unsigned 라서 그렇다는 등의 내용이 있는데 이 내용을 어떻게 확인할 수가 있나요? 제가 resize 함수의 정의에 가서 본 내용에서는 아래의 내용인데 관련된 힌트를 얻을 수가 없네요, 관련하여 조언주시면 감사하겠습니다! void resize(_CRT_GUARDOVERFLOW const size_type _Newsize, const _Elem _Ch = _Elem()) { // determine new length, padding with _Ch elements as needed const size_type _Old_size = size(); if (_Newsize <= _Old_size) { _Eos(_Newsize); } else { append(_Newsize - _Old_size, _Ch); } }
- 미해결홍정모의 따라하며 배우는 C++
while문
강의시간 14:40분의 코드를 실습해보았습니다. escape_flag가 true가 되었는데 출력이 되는 이유가 무엇인가요 break는 중간에 탈출을 하게되지만 이경우에는 true로 바꾸고 while문의 끝까지 돌고 종료가되는 것인지 궁금합니다. #include <iostream> using namespace std; int main() { bool escape_flag = false; while(!escape_flag) { char ch; cin >> ch; if(ch == 'x') escape_flag = true; cout << ch << endl; } }
- 미해결홍정모의 따라하며 배우는 C++
14:00부근에서
설명하실 때, resource의 copy연산자로 가는게 아니고, 거기서 그냥 포인터만 복사한다고 하셨습니다. 근데 이 경우에 파라미터 안에 R-Value가 들어오는 경우에는 shallow copy를 하기 위해 AutoPtr의 operator로 가는 것이고, L-Value가 들어오는 경우 deep copy를 하기 위해 resource의 copy operator로 간다고 생각하는게 맞나요? 혹시, AutoPtr에서 그냥 shallow, deep copy를 구현할 수 있는 코드를 짜면, Resource에서는 굳이 copy constructor나 operator를 넣지 않아도 되는지가 의문입니다.(AutoPtr<Resource>를 이용할 때) 그리고 AutoPtr<Resource> 이걸 어떻게 해석해야 하는지가 너무 헷갈리는데 정리해주실 수 있을까요?ㅜ 예전 강의 보면 vector<int>나 array<int>와 같이 해석하려는데, 여기서는 AutoPtr과 Resource가 둘다 class라서 해석하는데 어려움이 있는 것 같습니다.
- 미해결홍정모의 따라하며 배우는 C++
C언어를 하나도 모른상태로 수강해도 되나요??
학교에서 C++를 하는데 교수님이 C언어를 알고계신상태로 강의를 하셔서 이해가 하나도 안가더라구요 저는 전과를 해서 C언어를 안배웠는데 다른 애들은 다 배운상태고 C언어를 배우기엔 시간이 너무 촉박해서 그런데 바로 C++배워도 될까요??
- 미해결홍정모의 따라하며 배우는 C++
Interface 클래스
class IErrorLog { public: virtual bool reportError(const char* errorMessage) = 0; virtual ~IErrorLog() {} }; Q1. 인터페이스 클래스에서 pure virtual function에 = 0을 하는 이유가 리턴 타입이 bool이라 기본값 false 넣은건가요?
- 미해결홍정모의 따라하며 배우는 C++
Win 32라는 뜻은
win32라고 나온다는 것은 linux에서 visual studio를 진행하면 실행파일이 다른 형식으로 제공된다는 걸까요? + win에서 사용했던 파일을 linux 환경에서 옮겨서 실행하려고 하면 실행이 안 되나요? 저 부분에 (x86) -> configure manage 부분을 들어가보니 Arm 으로 디버깅하면 리눅스에서 실행할 수 있는 파일로 디버그 되는 걸까요? 좋은강의 감사드립니다
- 미해결홍정모의 따라하며 배우는 C++
배열과 포인터, 문자열 심볼릭 상수와 관계
int main() { char name[] = "ABC"; char *name2 = "DEF"; int arr[] = {10, 20, 30}; cout << name << endl; //ABC cout << &name << endl; //0x16..94 cout << *name << endl; //A = name[0] cout << *(name+1) << endl; //B = name[1] cout << &(*(name+1)) << endl; //BC ? --------질문(1) //cout << &(name+1) << endl; // --------------질문(1) cout << name2 << endl; //DEF cout << &name2 << endl; //0x16..88 cout << *name2 << endl; //D = ? -------------질문(2) cout << *(name2+1) << endl; //E = ? ----------질문(2) cout << arr << endl; //0x16..98 ? ------------- 질문(3) cout << &arr << endl; //0x16..98 ? ------------질문(3) cout << *arr << endl; //10 = arr[0] } 질문 1 주소값이 나오지 않고 BC가 나오는 이유는 무엇인가요 cout때문인가요 ? 또 &(name+1)은 왜 안되는 것인가요 질문 2 char *name 이 배열과 비슷하게 작동이 되는 것 같은데 배열로 봐야 하는 것인가요? 그럼 name2[0]으로 봐도 무방한것인가요 질문 3 arr와 &arr출력값이 같은데 arr는 주소값이라서 앞에 & 가 생략이 된 것인가요? 제가 봐도 너무 질문이 많고 두서가 없는데 너무 헷갈려서 정리가 잘 안되네요 죄송해요 해결부탁드립니다 ㅜ
- 미해결홍정모의 따라하며 배우는 C++
for문에 증감연산자 질문입니다.
for문 예제를 보면 for (int count = 0; count < 10; ++count) 에서 증감연산자 ++가 count앞에 오는걸 알 수 있는데요, 이 for문은 for (int count = 0; count < 10; count++) 로 바꾸어도 같은 결과가 출력이 되는것 같은데 ++count를 할때와 count++를 할때의 차이점이 있을까요?
- 미해결홍정모의 따라하며 배우는 C++
printInt 함수에서
밑줄 친 부분에서 "const" 가 없으면 오류 창에 " int& 형식(const 한정 형식아님)의 참조를 "Cents"형식의 값으로 초기화할 수 없습니다." 라고 뜨는데, 왜 그런걸까요?? 강의에서 다룬 적이 있는 것 같아서 처음부터 다시 찾아봤는데, 발견을 하지 못하여 질문드립니다.
- 미해결홍정모의 따라하며 배우는 C++
17.1 string
안녕하세요 strlen,strcpy같은 함수와 string을 같이 사용하고 싶을 때 헤더파일 cstring과 string을 둘다 include해도 되나요?
- 미해결홍정모의 따라하며 배우는 C++
5:10 부분 결과값이 강의와 약간 다르게 나오는데 원인이 뭔지 모르겠습니다
main.cpp #include "AutoPtr.h" #include "Resource.h" using namespace std; AutoPtr<Resource> generateResource() { AutoPtr<Resource> res(new Resource(3)); return res; } int main() { { AutoPtr<Resource> main_res; main_res = generateResource(); } return 0; } //////////////////////////// AutoPtr.h #pragma once #include <iostream> template<class T> class AutoPtr { public: T* m_ptr = nullptr; public: AutoPtr(T* ptr = nullptr) :m_ptr(ptr) { std::cout << "AutoPtr default constructor" << std::endl; } ~AutoPtr() { std::cout << "AutoPtr destructor" << std::endl; if (m_ptr != nullptr) delete m_ptr; } T& operator*() const { return *m_ptr; } T* operator->()const { return m_ptr; } bool isNull()const { return m_ptr == nullptr; } AutoPtr(const AutoPtr& a) { std::cout << "AutoPtr copy constructor" << std::endl; //deep copy m_ptr = new T; *m_ptr = *a.m_ptr; } AutoPtr& operator=(const AutoPtr& a) { std::cout << "AutoPtr copy assignement" << std::endl; if (&a == this) return *this; //deep copy m_ptr = new T; *m_ptr = *a.m_ptr; return *this; } ///////////////////////////////////// Resource.h #pragma once #include <iostream> class Resource { //private: public: int* m_data=nullptr; unsigned m_length = 0; public: Resource() { std::cout << "Resource default constructed" << std::endl; } Resource(unsigned length) { std::cout << "Resource length constructed" << std::endl; this->m_data = new int[length]; this->m_length = length; } ~Resource() { std::cout << "Resource destroyed" << std::endl; if (m_data != nullptr) delete[]m_data; } Resource(const Resource& res) { std::cout << "Resource copy constructed" << std::endl; Resource(res.m_length); for (unsigned i = 0; i < m_length; ++i) m_data[i] = res.m_data[i]; } Resource& operator =(Resource& res) { std::cout << "Resource copy assignment" << std::endl; if (&res == this)return *this; if (this->m_data != nullptr)delete[]m_data; m_length = res.m_length; m_data = new int[m_length]; for (unsigned i = 0; i < m_length; ++i) m_data[i] = res.m_data[i]; return *this; } void print() { for (unsigned i = 0; i < m_length; ++i) std::cout << m_data[i] << " "; std::cout << std::endl; } }; 웬만하면 코드 질문은 스스로 해결하려고 했는데 며칠 고민하면서 디버거로 찍어봐도 중간중간에 뜬금없이 생성자가 호출되거나 다시 복사가 되는 원인을 못찾겠습니다
- 미해결홍정모의 따라하며 배우는 C++
[3:30] 함수의 매개변수 주소
안녕하세요! 항상 좋은 답변 감사드립니다. doSomething 함수에서 선언된 매개변수 int y의 주소가, doSomething(5) doSomething(x) doSomething(x+1) 실행될 때마다 똑같은데, 함수가 한번 실행 되면 할당받은 주소가 없어지고, 두번째 실행부터는 다른 주소가 뜰것 같은데 셋 다 똑같네요.. 왜 그런 것인가요?
- 미해결홍정모의 따라하며 배우는 C++
생성자 초기화
Fraction(const int& num_in = 1, const int& den_in = 1) { m_numerator = num_in; m_denominator = den_in; } q1. 생성자 초기화를 매개변수 모두 해주면 기본생성자 역할도 한다는 말씀이 이해가 잘안가서요
- 미해결홍정모의 따라하며 배우는 C++
[13:37] throw, catch문에서 auto casting이 안되는 예와 관련된 설명 문의
안녕하세요, 항상 질문 답변해주셔서 감사드립니다. 강의 중 auto casting이 안되는 예에 대해서 아래와 같은 코드를 이용해 설명해주셨습니다. try { //if (x < 0.0) throw std::string("Negative input"); if (x < 0.0) throw "Negative input"; cout << std::sqrt(x) << endl; } catch (std::string error_message) { //do something to respond cout << error_message << endl; } 교수님께서는 문자열에 마우스를 올리시면서 "Negative input"에 대해 'const char *'라고 말씀을 하시는데요, 저도 이전 강의들을 통해서 문자열은 'const char *'에 저장된다고 알고 있었습니다. 하지만 정작 마우스를 올려보면 아래와 같이 표현이 됩니다. (const char[15])"Negative input" 실제로 아래와 같이 코드를 구성해서 테스트를 해보면 에러가 발생하는데요, try { if (x < 0) throw "Negative input"; cout << std::sqrt(x) << endl; } catch (const char error[]) { cout << "const char array" << endl; cout << error << endl; } catch (const char *error) { cout << "const char pointer" << endl; cout << error << endl; } error C2312: 'const char *': is caught by 'const char []' 최종적으로 질문은 'const char *'와 'const char[]'은 throw, catch문에서 같은 것으로 인식되는지 궁금하고 혹시 이유에 대해 설명해주시면 감사하겠습니다. 감사합니다.