월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C++
함수포인터에 관한 질문이 있습니다
7.9 함수포인터 강의에서 선생님께서 함수는 그 이름 자체가 포인터이다 따라서& 안붙이고 보내도 포인터에서 받을수있다 라고 하셨는데 왜 이번강의에서는 8분 38초쯤 int(something::*fptr1)=&Something::temp; 이런식으로 &를 붙여서 사용하시는건가요?
- 미해결홍정모의 따라하며 배우는 C++
1.3 변수와의 첫 만남 강의 중 초기화되지 않은 변수에 접근하는 경우에 대해서 질문이 있습니다.
우선, 저는 Visual Studio 2019를 사용중입니다. 강의에서는 Debug구성을 사용하여 int x; std::cout << x << std::endl; 를 빌드한 후 실행하면, 실행 자체는 되는데 런타임 에러가 나는 것으로 이해했습니다. 하지만 저의 환경에서는 같은 코드가 빌드 자체가 되지 않습니다. 빌드 시작... 1>------ 빌드 시작: 프로젝트: c_113, 구성: Debug Win32 ------ 1>variables.cpp 1>C:\Users\nachi\Desktop\My Projects\CPP\c_113\variables.cpp(5): error C4700: 초기화되지 않은 'x' 지역 변수를 사용했습니다. 1>"c_113.vcxproj" 프로젝트를 빌드했습니다. - 실패 ========== 빌드: 성공 0, 실패 1, 최신 3, 생략 0 ========== 처럼 빌드가 실패됩니다. Release구성도 마찬가지로, 초기화되지 않은 변수에 컴파일러가 가장 그럴듯하다고 생각하는 0이 들어가는게 아니라 빌드 자체가 되지 않습니다. 혹시 Visual Studio 2019로 버전업 되면서 정책 같은 것이 바뀐 것인가요?
- 미해결홍정모의 따라하며 배우는 C++
define 의 의미와 하는 일
안녕하세요! 매번 감사드립니다,. 1) 전처리기 챕터에서 define을 처음 배우는데 define을 했을 때 컴퓨터에서 발생하는 일이 궁금합니다. #define #endif 2) 모두 전처리기라면 main함수 바깥 즉 제일 처음 부분에서만 써야되는 줄 알았는데 강의를 보면 그렇지도 않은 것 같습니다. 아래에서 처럼 LIKE_APPLE 의 변수 선언 같은 것을 아무것도 안했는데 이런 처리과정이 가능한게 잘 이해가 안갑니다. #define LIKE_APPLE int main() { #ifdef LIKE_APPLE cout<<"apple\n"; #endif LIKE_APPLE cout<<"nothing\n"; }
- 미해결홍정모의 따라하며 배우는 C++
매크로에선 식별자가 필요없는가? 에 대한 질문
안녕하세요! 1) 강의 4:68즈음에 #define MAX(a,b) ( (a) > (b) ) ? (a) : (b) 이런 식을 나오는데 함수와 다르게 a나 b에 대해 int 선언 같은 걸 안해줘도 되나요?? 2) 함수와 역할이 거의 흡사한 것 같은데 차이점이 뭔지 궁금합니다. 적용 범위의 차이인가요?
- 미해결홍정모의 따라하며 배우는 C++
특정 프로젝트 빌드
강의 보는데 제가 놓친건지 잘 모르겠지만 빌드 하실 때 프로젝트 언로드도 아니고 소스파일 빌드 제외 하시는 것 같지도 않은데 어떻게 특정 프로젝트만 빌드하고 결과 출력을 하는지 단축키가 궁금 합니다.
- 미해결홍정모의 따라하며 배우는 C++
중괄호의 포함관계
안녕하세요 강의 4:40 대에 소속된 중괄호가 다르면 같은 변수명을 초기화하더라도 메모리 주소가 다른 곳에 저장된다고 나옵니다. 그리고 강의 7:15에서는 x가 중괄호 밖으로 나온 순간 사용할 수 없다고 합니다. 그런데 강의 8:10에서 초기화를 하지 않고 "안 쪽"의 중괄호의 x=2를 쓰고, 그 떄의 주소를 보면 "바깥 괄호"의 x 주소를 그대로 사용하는 것을 확인할 수 있습니다. 중괄호의 포함관계가 적용되는 것인가요? 포함관계가 없는 중괄호 끼리는 변수를 혼용해서 못쓰는 것인가요? ex) int main () { int x = 4; { x =5; int y = 4; } { y=6; } } 위 코드는 에러가 납니다. 그 이유를 분석해보면 , 포함관계가 있는 중괄호라면, 즉 큰 범위에서 정의된 x는 값을 변경하는 게 가능하지만 독립된 범위에서 정의된 y는 포함관계가 없는 중괄호에서의 y는 정의되지 않았기 떄문에 값을 변경하는 게 불가능해서 인가요? 그런데 .. 오로지 포함관계로 볼 수 도 없는 것이 안 쪽 중괄호가 바깥 중괄호에 포함되는 것이라면 int main() { int x =4; { int x= 5; } } 위 코드는 에러가 나야합니다. 큰 범위의 중괄호에서 이미 정의된 x를 두 번 정의하기 떄문에요. 하지만 주소값을 출력해보면 위 x와 아래 x가 다른 메모리 주소값을 갖게 됩니다. 정리를 하자면, int main() { int x = 5; { int x= 3; } } 이 가능하려면 int main() { int x =3; { x=5; } } 가 가능할 수 없다고 생각합니다.
- 미해결홍정모의 따라하며 배우는 C++
char배열에서의 배열명과 int 배열에서의 배열명 출력하기
안녕하세요. int arr[5] = {1,2,3,4,5}; cout << arr << endl; => 이렇게 하면 배열명 arr의 주소값 이 출력됩니다. (저의 지식으로는 배열명이 포인터(주소를 저장하는 변수)이기 때문에 위의 출력은 이해가 갑니다만, char배열에서는 다르게 출력이 되어서 의문입니다.) 하지만 char word[6] = "hello"; cout << word << endl; => 이렇게 하면 hello가 출력되는데 왜 이렇게 되는지 알고 싶습니다... 이 강의 질문 내용 중에 교수님께서 답변하신 내용이 전통적으로 char배열명은 value값으로 출력한다고 하셨는데, 이 답변이 맞는 건가요?
- 미해결홍정모의 따라하며 배우는 C++
16분 17초쯤에 질문이 있습니다
선생님께서 Fraction one_thirds=Fraction{1,3}; 이 경우는 복사한 instance 가 one_thirds 로 들어가 초기화를 해주신다고 하셨는데 instance 가 만들어지기 위해선 변수명을 지정해주어야하는거 아닌가요? 예를들어 Fraction one_thirds=Fraction a{1,3}; 이런식으로 해야지 복사된 instance 가 one_thirds class 에들어가서 초기화가 되는거 아닌가요?
- 해결됨홍정모의 따라하며 배우는 C++
func_wrapper 매개변수 질문입니다
안녕하세요 template<typename T> void func_wrapper(T &&t) { func(std::forward<T>(t)); // forward R로 오면 Rref로 L 로 오면 Lref 로 바다줌 } int main() { MyStruct s; func_wrapper(s); func_wrapper(MyStruct()); // template에 넣을땐 다 L-ref 로 들어가는 문제 //func(s); // L-ref //func(MyStruct()); // R-ref return 0; } 위에 template<typename T> void func_wrapper(T &&t) { func(std::forward<T>(t)); } 에서 매개변수를 T &&t 로 받고있는데 main 함수내에 func_wrapper(s); func_wrapper(MyStruct()); 에서 MyStruct()는 R-ref로 들어갈수있다고 생각이드는데 s는 l-ref인데 어떻게 T &&t 로 넣을수있는지 궁금합니다
- 해결됨홍정모의 따라하며 배우는 C++
과제질문입니다 // TODO: use promise
안녕하세요 마지막에 cout << "Future" << endl; { const auto sta = chrono::steady_clock::now(); unsigned long long sum = 0; vector<std::future<int>> futures; futures.resize(n_threads); const unsigned n_per_thread = n_data / n_threads; // assumes remainder = 0 for (unsigned t = 0; t < n_threads; ++t) futures[t] = std::async(dotProductFuture, std::ref(v0), std::ref(v1), t * n_per_thread, (t + 1) * n_per_thread); for (unsigned t = 0; t < n_threads; ++t) sum += futures[t].get(); const chrono::duration<double> dur = chrono::steady_clock::now() - sta; cout << dur.count() << endl; cout << sum << endl; cout << endl; } 이 코드를 쓰레드와 함께해서 사용해보고 promise 사용해보라고 하셨는데 // TODO: use divide and conquer strategy for std::thread // TODO: use promise cout << "Thread future" << endl; { const auto sta = chrono::steady_clock::now(); vector<thread> threads; threads.resize(n_threads); std::promise<int> p; auto f = p.get_future(); const unsigned n_per_thread = n_data / n_threads; // assumes remainder = 0 for (unsigned t = 0; t < n_threads; ++t) threads[t] = std::thread(dotProductEx1, std::ref(v0), std::ref(v1), t * n_per_thread, (t + 1) * n_per_thread, move(p)); for (unsigned t = 0; t < n_threads; ++t) threads[t].join(); const chrono::duration<double> dur = chrono::steady_clock::now() - sta; int i = f.get(); cout << dur.count() << endl; cout << i << endl; cout << endl; } void dotProductEx1(const vector<int> &v0, const vector<int> &v1, const unsigned i_start, const unsigned i_end, std::promise<int> &&p) { int sum = 0; // local sum for (unsigned i = i_start; i < i_end; ++i) sum += v0[i] * v1[i]; // p.set_value(sum); } 이렇게 해봤는데 런타임에러가 나네요 ㅜㅜ 어떻게 해야할지 좀 알려주시면 감사하겠습니다 너무헷갈리네요..
- 미해결홍정모의 따라하며 배우는 C++
10분 25초때 질문이 있습니다
void print(char *ptr) {}; int main() { print("a"); } 여기서 const char*ptr 을 해주면 오류가 안뜨는 이유가 뭔가요? parameter가 포인터 이므로 char 타입의 주소를 argument 로 보내주어야하는거 아닌가요? 근데 왜 const 를 사용하니까 오류가 뜨지않는건가요?
- 미해결홍정모의 따라하며 배우는 C++
4:38분 괄호가 없어도 실행이 되는데 바뀐건가요?
4:38초에 괄호가 없을 경우 두가지를 같이 출력할 수 없다고 하셨는데 지금은 가능하던데 업데이트로 바뀐건가요?? int a; cin >> a; if (a < 10) cout << "1출" << endl; else cout << "3중" << endl; cout << "2중" << endl; 11입력할 경우 3중 2중 두개가 실행이 되던데
- 미해결홍정모의 따라하며 배우는 C++
7분 46초쯤 에 질문이 있습니다
int *r1=new int[col]{1,2,3,4,5}; int *r2=new int[col]{6,7,8,9,10}; int *r3=new int[col] {11,12,13,14,15}; int **rows=newint*[row]{r1,r2,r3}; for(int r=0;r<row;r++) { for(int c=0;c<col;c++) cout<<rows[r][c]<<" "; cout<<endl; } 이렇게 돌리면 어쩨서 바로 정수값이 나오는건가요? 제가 알기론 포인터에 들어가있는 주소값이 가리키고있는 값을 알기 위해서 *dereferencing 을 해야한다 알고있는데 어째서 위의 값은 dereferencing 을 하지않고도 바로 정수값이 나오는건가요?
- 미해결홍정모의 따라하며 배우는 C++
6.8 어쩨서 함수안에서 dereference 한 값이 함수밖에서도 영향을 주나요?
//void printArray(int array[]) void print Array(int *array) 서로 같다 { cout<<*array<<endl;//op 9 *array=100;//함수밖에서도 변수의 값을 바꿀수있다 } int main() { int array[5]={9,7,5,3,1} printArray(array); cout<<array[0]<<" "<<*array<<endl; } 선생님이 print array함수 안에서 *array=100 이런식으로 하면 함수밖에서도 변수의 값은 바꿀수있다하셨는데 그렇게 할려면 & reference operator 를 써줘야하는거 아닌가요? int main()에서 복사된값이 printArray 함수로 들어가는거일텐데 어쩨서 함수밖에서도 변수의 값이 바뀌나요?
- 해결됨홍정모의 따라하며 배우는 C++
8:10 질문입니다
안녕하세요! 1. 8:10초에 AutoPtr<Resource> res = new Resource; 는 포인터가 아니라 자체가 스마트 포인터이기 때문에 *res가 아닌 res로 한다고 하셨는데 new Resource는 메모리 동적할당을 받아서 주소를 가지고 있는데 res에 넣는게 가능한건가요?? 2. AutoPtr.h 헤더 내부에 AutoPtr(AutoPtr &a) { m_ptr = a.m_ptr; a.m_ptr = nullptr; } 이 함수는 디버깅해보니 이 예제에선 아예 사용되지 않던데 그냥 이렇게 쓰인단걸 알려주시기 위해서 이 강의에 넣으신건가요??
- 해결됨홍정모의 따라하며 배우는 C++
const 질문입니다
안녕하세요 #include "Cents.h" using namespace std; template<typename T> T getMax(T x, T y) { return (x > y) ? x : y; } int main() { cout << getMax(1, 2) << endl; cout << getMax(3.14, 1.592) << endl; cout << getMax(1.0f, 3.4f) << endl; cout << getMax('a','c') << endl; std::cout << getMax(Cents(5), Cents(9)) << std::endl; return 0; } #pragma once #include <iostream> class Cents { private: int m_cents; public: Cents(int cents) :m_cents(cents) {} friend bool operator > (const Cents &c1, const Cents &c2) { return (c1.m_cents > c2.m_cents); } friend std::ostream &operator << (std::ostream &out, const Cents ¢s) { out << cents.m_cents << " cents"; return out; } }; 전체 코드입니다. Cents 클래스 내에서 operator > 와 operator << 함수에서 operator > 함수 파라미터에선 const 없이 friend bool operator > (Cents &c1, Cents &c2) { return ( c1.m_cents > c2.m_cents); } 가 가능 한데 operator << 함수 파라미터에서 const 없이 friend std::ostream &operator << (std::ostream &out, Cents ¢s) { out << cents.m_cents << " cents"; return out; } 이렇게 할 경우 에러가 나는데 const 붙여서 수정 못하게 할 때 붙이는줄 알았는데 어떤 차이 인가요..? 계속 질문드려서 죄송합니다 ㅜ
- 해결됨홍정모의 따라하며 배우는 C++
delete 질문입니다
#include <iostream> using namespace std; class Base { public: virtual ~Base() { cout << "~Base()" << endl; } }; class Derived : public Base { private: int *m_array; public: Derived(int length) { m_array = new int[length]; } ~Derived() { cout << "~Derived" << endl; delete[] m_array; } }; int main() { //Derived derived(5); Derived *derived = new Derived(5); Base *base = derived; delete[] base; return 0; } 마지막에 delete base; 에서 delete[] base; 로 해도 되는데 똑같이 작동하는건가요?
- 미해결홍정모의 따라하며 배우는 C++
std::cin.clear() 의 기능에 대한 질문입니다.
안녕하세요. 좋은 강의와 매번 친절한 답변 덕분에 좋은 환경속에서 공부하고 있습니다. 감사합니다. 질문이 있어서 글을 남깁니다. std::cin.clear(); 의 기능에 대한 질문입니다. 해당 기능은 'cin으로 받은 것 중 버퍼에 쌓인 것을 지워준다.' 로 알고 있습니다. 그런데 아래와 같이 코드를 돌렸을 때 std::cin.clear();를 했음에도 불구하고 버퍼에 아직 쌓여있는것 같아서 이렇게 질문을 남깁니다. ---코드 --- #include <iostream> int main() { using namespace std; int x; int y; int z; // 예시로 123 456 789 를 입력함 cin >> x; std::cin.clear(); //퍼버에 쌓인것을 다 지워준다. // 버퍼에 있는 것을 모두 지웠으니 입력되지 않을 것으로 기대함 cin >> y; cin >> z; cout << x <<" " << y << " " << z <<endl; return 0; } 제가 혹시 잘 못 코딩한거라던지 cin.clear() 의 기능에 대해 잘 못 알고 있는게 있을까요?
- 해결됨홍정모의 따라하며 배우는 C++
안녕하세요 질문입니다
#pragma once #include <string> #include "Position2D.h" class Monster { private: std::string m_name; // char * data, unsigned length; Position2D m_location; //int m_x; // location //int m_y; public: Monster(const std::string name_in, const Position2D & pos_in) :m_name(name_in), m_location(pos_in) { } //void moveTo(const int &x_target, const int &y_target) //{ // m_x = x_target; // m_y = y_target; //} void moveTo(const Position2D &pos_target) { //m_x = x_target; //m_y = y_target; m_location.set(pos_target); } friend std::ostream &operator << (std::ostream &out, Monster &monster) { out << monster.m_name << " " << monster.m_location << std::endl; return out; } }; 값 변경이 안되게 하는거 같은데 상수화하는것 같은데 moveTo 함수 내에서 파라미터로 const를 빼면 왜 안되는것인지 궁금합니다 operator << 함수에선 const 를 안붙여도 되는건가요? 그리고 #pragma once #include <iostream> class Position2D { private: int m_x; int m_y; public: Position2D(const int& x_in, const int & y_in) :m_x(x_in), m_y(y_in) {} // TODO: overload operator = void set(const Position2D & pos_target) // 파라미터 왜 const { set(pos_target.m_x, pos_target.m_y); // m_x = pos_target.m_x; // m_y = pos_target.m_y; } void set(const int &x_target, const int &y_target) { m_x = x_target; m_y = y_target; } friend std::ostream &operator << (std::ostream &out, Position2D &Position2D) { out << Position2D.m_x << " " << Position2D.m_y << std::endl; return out; } }; 마찬가지로 여기선 operator << 함수에 파라미터중 Position2D에 const를 안붙여도되나요? 너무 헷갈리는데 어디부분을 복습해야할까요..
- 미해결홍정모의 따라하며 배우는 C++
메모리에 대한 질문입니다.
C++ 강의를 들으면서 메모리에 대한 내용을 최대한 구체적으로 생각하면서 들으려고 합니다. 현재 C++ 강의로 std::async에 대한 내용까지 들었는데, 개인적으로 공부하면서 std::async의 경우 각 스레드가 Heap 영역을 공유하고, 각 스레드는 독립적인 Stack 영역을 가진다고 알게 되었습니다. 여기서 궁금한 점이 참조 변수의 경우, 각 스레드들이 공유할 수 있는데 그러면 참조 변수의 경우 Heap 영역에 할당되는 것인지 궁금합니다. 예를들면, #include <iostream> #include <vector> #include <future> int main() { int number = 100; // 변수 number의 경우, 스택 영역에 할당 std::vector<std::future<void>> task1; task1.resize(number); for (int i = 0; i < number; i += 1) // 변수 i의 경우, 스택 영역에 할당 { task1[i] = std::async([&, i] { // number의 경우, 참조 변수로 받기 때문에 스레드간의 공유를 할 수 있음 // 변수 i의 경우, 복사되어 각 스레드의 스택 영역에 할당되고, int k = 0; std::cout << &number << "\t" << &i << "\t" << &k << std::endl; }); } } } 위 코드에서, number 변수의 경우 main에서 스택 영역에 할당 되지만, async를 통해 비동기 작업을 실행할 때 참조변수로 받아지게 됩니다. 변수 i의 경우는 복사를 하여 각 스레드의 스택에 할당되게 됩니다. 따라서 모든 스레드에서 number의 주소값을 동일하게 표현하고, i의 주소값은 다른것을 확인할 수 있습니다. 만약 스택 영역에 할당되어 있다면 공유가 불가능할 것인데, 이렇게 공유를 할 수 있는 이유는 참조변수로 받는 과정에서 number 변수에 해당하는 데이터를 Heap 영역으로도 올려주기 때문인가요? (스택으로 할당된 메모리를 스레드간에서 공유할 수 있는 이유가 궁금합니다.) 메모리에 대한 이해가 부족해서 잘 이해가 되지 않습니다. 항상 좋은 강의 너무 감사드립니다.