묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C++
질문이 있습니다
1. 정적 멤버 변수는 class 내에서 초기화가 불가능한 이유를 아무리 찾아봐도 const를 붙여서 초기화 하는 방법 밖에 없던데 왜 그런지 이유가 궁금합니다. 2. 5:22초 에서 정적 변수는 main 함수 내에서 직접 접근 할 수 있는게 클래스 내부에서 정적 변수를 선언하고 프로그램을 실행할 때 객체가 생성되지 않아도 정적 변수는 메모리에 올라가 있기 떄문에 직접 접근 할 수 있는 건가요?
-
미해결홍정모의 따라하며 배우는 C++
9.8 형변환 질문이 있습니다.
강의에서 operator int() 와 operator Cents() 이렇게 함수를 선언하는데 선언에서 반환형이 없는데 return이 어떻게 알맞게 int, Cents 로 반환이 되는거죠? 그리고 Cents cents = dollar 이렇게 대입을 해줬는데 cents에서 어떻게 dollar를 알아서 형변환을 해서 넣어주는건지도 많이 당황스럽습니다. 제 생각에는 Cents cents = Cents(dollar) 이렇게 해줘야 된다고 생각하는데..c++를 배우는데 c++를 유독 사용자가 신경써야할 것이 많다고 느꼈는데 이렇게 신경을 안써도 자동으로 해주는게 조금 낯설어서 이렇게 질문드립니다. #include using namespace std; class Cents { int m_cents; public: Cents(int cents = 0) { m_cents = cents; } operator int() { cout << "cast here" << endl; return m_cents; } }; class Dollar { private: int m_dollars = 0; public: Dollar(const int& input) : m_dollars(input) {} operator Cents() { return Cents(m_dollars * 100); } }; void print(const int& input) { cout << input << endl; } int main() { Dollar dol(2); Cents cents = dol; print(cents); return 0; }
-
해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
팩토리얼을 보고 습관적으로 재귀형태로 만들었는데 상관 없을까요?
#include <stdio.h> #include <vector> #include <algorithm> using namespace std; int func(vector<int> &v, int n){ int tmp=n; if(n>1){ func(v, n-1); //then divide n int i=2; while((i<=tmp)&&(tmp>1)){ if(tmp%i==0){ v[i]++; tmp=tmp/i; }else{ i+=1; } } } return 0; } int main(){ //freopen("input.txt","rt", stdin); int n, i; scanf("%d",&n); vector<int> v(n+1); func(v, n); printf("%d! = ",n); for(i=2; i<=n; i++){ if(v[i]!=0) printf("%d ", v[i]); } return 0; }
-
해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
9번문제
#include <stdio.h> int main(){ int num[50002]; int N; scanf("%d",&N); for(int i = 1; i<=N ; i++){ for(int j = i; j<=N ; j+=i){ num[j]++; } } for(int i = 1; i<=N; i++){ printf("%d ",num[i]); } } 전역변수 말고 지역변수로 설정하면 값의 출력이 어느 순간부터 이상해지는데 이유가 뭘까요?
-
해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
54번 스택 관련 궁금증이 있습니다.
안녕하세요 스택 관련 궁금증이 있습니다. NO일때 break 대신에 곧바로 return 하면 flag 변수를 사용하지 않아도 같은 결과가 나오는것 같습니다 new로 할당하고 delete 하지 않으면 메모리에 남아있는 것처럼 스택도 들어있는 값들을 모두 pop하지 않으면 문제가 발생하거나 안좋을까요...?? int main() { //freopen("input.txt", "rt", stdin); stack<char> s; char a[50]; int i; scanf("%s", &a); for (i = 0; a[i] != '\0'; i++) { if (a[i] == '(') { s.push(a[i]); } else { if (s.empty()) { printf("NO\n"); return 0; } else s.pop(); } } if (s.empty()) printf("YES\n"); else printf("NO\n"); return 0; }
-
해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
제가 직접 짠 코드에서 16번문제 4번에서만 오류가 납니다.
이상하게 4번에서만 오류가 나서 반례가 있는지 계속 생각해봤는데 생각이 잘 안되서 질문드립니다! aRes 는 a의 해당 a[i]번 값의 갯수를 저장하고 bRes는 b의 해당 b[j]번 값을 저장합니다. 그리고 그 값이 같을때 flag를 flase로 해줍니다. c++ 에서도 강사님과 같은 방법을 써야하나요? 제 코드와 차이점이 뭔가요? 시간 측면에서 더 효율적인건가요? #include #include int main(){ using namespace std; //freopen("input.txt", "rt", stdin); string a,b; int i,j; int aRes,bRes; bool flag=true; cin>>a>>b; if(a.length()==b.length()){ flag=true; for(i=0; i<a.length(); i++){ aRes=1,bRes=1; for(j=0;j<a.length();j++){ if(a[i]==b[j]) bRes++; } for(j=i+1;j<a.length();j++){ if(a[i]==a[j]){ aRes++; } } if(aRes!=bRes) flag=false; } if(flag) cout<<"NO"; else cout<<"YES"; } return 0; }
-
미해결홍정모의 따라하며 배우는 C++
14:30 really necessary?
14:30 경에 교수님은 Autoptr(Autoptr &&a) Autoptr & operator=(Autoptr&&a) 에서 a.m_ptr 이really necessary 한지 여부를 따지고 계신데요, 교수님의 결론은 굳이 안써줘도 된다 였습니다. 그런데 저는 이해가 안됍니다 . a.m_ptr=null ptr; 이없다면 , 소유권이전이 안돼는 (move semantics가 안돼는) 것 아닌가 싶네요 . 따라서 main.cpp에서 generateResource() 가 종료되며 Autoptr res 객체가 소멸되며 ~Autoptr이 작동해 (a.)m_ptr이 해제되어 프로그램의 출력결과도 Autoptr default constructor Resource length constructed Autroptr default constructor Autoptr move assignment Resource destructed Autoptr destructor 에러 ( 이미 지운메모리 영역을 다시 지우려함 ) 위와 같이 되야하는것 아닌가 싶네요 . 또한 위의 질문과는 별개로 , Autoptr(Autoptr &&a) Autoptr & operator=(Autoptr&&a) 을 구현할때 왜 굳이 R-Value reference (&&)을 사용하신건지 궁금합니다. l-value reference(&) 와 r-value refernce 가 분명히 정의상 차이는 있다만 여기서는 굳이 기능상 차이가 있나 싶거든요. 그냥 l-value reference(&) 로 받아 Autoptr(Autoptr &a) Autoptr & operator=(Autoptr&a) 으로 했어도 결과는 똑같은것 같은데 ... 어떻게 생각하시나요?
-
미해결홍정모의 따라하며 배우는 C++
강의 마지막부분 IntArray 클래스 구현 .
아래 코드는 제가 직접 구현해본 IntArray 클래스 입니다. ------------------------------------------------ #include<iostream> #include<initializer_list> class intarray { private: int m_length = 0; int* m_data = nullptr; public: intarray(unsigned length) :m_length(length) { m_data = new int[m_length]; } intarray(const std::initializer_list<int>& list) :intarray(list.size()) { int count = 0; for (auto& element : list) { m_data[count] = element; ++count; } } intarray& operator=(const intarray& arr) { if (this == &arr) { return *this; } this->m_length = arr.m_length; delete[] m_data; if (arr.m_data != nullptr) { m_data = new int[m_length]; for (int i = 0; i < m_length; i++) { m_data[i] = arr.m_data[i]; } } else { m_data = nullptr; } } void reset() { if (m_data != nullptr) delete[] m_data; m_data = nullptr; m_length = 0; } intarray& resize(const int &size) { if (size > m_length) { intarray temp(0); temp = (*this); reset(); m_length = size; m_data = new int[m_length]; for (int i = 0; i < temp.m_length; i++) { (*this).m_data[i] = temp.m_data[i]; } for (int i = temp.m_length; i < m_length; i++) { m_data[i] = 0; } } else if (size < m_length) { int* temp = new int[size]; for (int i = 0; i < size; i++) { temp[i] = m_data[i]; } reset(); m_length = size; m_data = new int[m_length]; for (int i = 0; i < size; i++) { m_data[i] = temp[i]; } delete[] temp; } return *this; } intarray& insertbefore(const int& value, const int& ix) { resize(m_length + 1); int* arr = new int[m_length - 1 - ix]; for (int i = 0; i < m_length - ix - 1; i++) { arr[i] = m_data[i + ix]; } m_data[ix] = value; for (int i = 0; i < m_length - ix; i++) { m_data[ix + 1 + i] = arr[i]; } delete[]arr; return *this; } intarray& remove(const int& ix) { intarray temp(m_length - 1); for (int i = 0; i < ix; i++) { temp.m_data[i] = m_data[i]; } for (int i = ix + 1; i < m_length; i++) { temp.m_data[i - 1] = m_data[i]; } resize(--m_length); (*this) = temp; return *this; } intarray& pushback(const int& value) { resize(++m_length); m_data[m_length - 1] = value; return *this; } friend std::ostream& operator <<(std::ostream& out, const intarray& arr) { for (int t = 0; t < arr.m_length; t++) { out << arr.m_data[t] << " "; } return out; } ~intarray() { if (m_data != nullptr) { delete[] m_data; } } }; int main() { intarray myarr{ 1,3,5,7,9 }; std::cout << myarr << std::endl; /*std::cout << myarr.resize(4) << std::endl; //for resize test. std::cout << myarr.resize(6) << std::endl;*/ //for resize test. std::cout<<myarr.insertbefore(10, 1)<<std::endl; std::cout<<myarr.remove(3) << std::endl; std::cout<<myarr.pushback(13) << std::endl; return 0; } --------------------------------------------- 작동은 제대로 됩니다만 , Debug 모드와 Release 모드 실행시 차이가 있습니다 . 위와같은 릴리즈모드에시 실행시에는 아무 에러창없이 실행되구요 위와같이 디버그모드서 실행시 디버그 에러가 납니다. 다만 , 실행결과에는 차이가없구요. 왜그런건가요?
-
미해결홍정모의 따라하며 배우는 C++
v.push_back(std::move(str));
string str = "Hello"; 13:09 v.push_back(std::move(str)); 해준게 str의 주소 값을 넘겨준게 맞나요?
-
미해결홍정모의 따라하며 배우는 C++
s_value 초기화하는 부분이 이상한것 같습니다.
s_value는 클래스 내부에서 private로 선언되어 있는데 어떻게 외부에서 접근해서 초기화를 해줄 수 있는 건가요? setValue 등으로 접근이 가능하다고 하면 이해는 하겠는데 헷깔립니다.
-
미해결홍정모의 따라하며 배우는 C++
Static이 클래스 내에서 초기화 되지 않는 이유가 뭔가요?
C#에서은 클래스 내부에서 static 사용시 초기화가 가능한데 C++은 초기화가 되지 않도록 막은 이유가 있을까요?
-
미해결홍정모의 따라하며 배우는 C++
11:49 경에
안녕하세요. 강의 잘 듣고 있습니다. 11:49 경에 int (Something:: * fptr1)() = &Something::temp; cout << (s1.*fptr1)() << endl; 로 펑션 포인터를 선언하고 출력하였는데, int (*fptr2)() = &Something::getValue; cout << fptr2() << endl; 에서는 펑션포인터를 출력할때 왜 *를 붙이지 않는지 궁금합니다. getValue 함수가 static이라 인스턴스에 상관없이 호출할 수 있는것은 알겠는데 temp함수의 펑션 포인터를 출력할때와 getValue함수의 펑션 포인터를 출력할 때에 *의 유무의 차이가 궁금하네요.
-
해결됨홍정모의 따라하며 배우는 C++
42분대 include한 변수의 메모리 주소
//main.cpp #include <iostream> #include "constants.h" extern void printLocation(); extern void printLocation2(); int main(void) { std::cout << "main.cpp " << &constants::global << std::endl; printLocation(); printLocation2(); return 0; } // print.cpp #include <iostream> namespace constants { extern const int global; } extern void printLocation2(void) { using namespace std; cout << "print.cpp " << &constants::global << endl; } // location.cpp #include <iostream> #include "constants.h" extern void printLocation(void) { std::cout << "location.cpp " << &constants::global << std::endl; } // constants.cpp namespace constants { extern const int global(123); extern const int global2(472); } // constants.h #pragma once namespace constants { extern const int global; extern const int global2; } 위에서 cout으로 찍은 메모리의 주소가 전부 같게 나오는데 내부 동작 순서가 extern으로 정의된 변수의 값을 constants.h 헤더 파일에서 참조하고 다른 파일에서는 constants.h 헤더 파일을 include 함으로서 전부 같은 메모리의 주소를 가지게 되는건가요? 그래서 헤더 파일을 포함하지 않고 직접 global 변수를 extern해준 print.cpp에서도 같은 주소를 가지게 되는건가요? 만약 그렇다면 해더 파일에 선언 해줌으로서 cpp파일은 헤더 파일만 include 해주면 전부 사용이 가능하다는 이점이 있는거 같고, include없이 사용이 가능한건 장점인지 단점인지 잘 모르겠네요. 강의 정말 재미있고 알차게 보고 있습니다. 최근 삶의 활력소 역활을 해주네요. 감사드립니다.
-
미해결홍정모의 따라하며 배우는 C++
이 후 공부과정.
교수님 안녕하세요. 오늘부로 강의를 전부 수강하였습니다. 다시 한번 모르는 부분을 확인하며 처음부터 공부하려고 합니다. 혹시 추천해주실 C++ 책이나 연습문제 책 있으신가요? 그리고 교수님의 C++ 연습문제 과정을 수강하려 하는데 교육과정의 레벨이 많이 높은가요?
-
미해결홍정모의 따라하며 배우는 C++
13.4 클래스 맴버 함수 특수화
다름이 아니라 수업을 듣다가 auto라는 변수선언 하는 방식이랑 Templete를 사용하는 방식의 차이가 갑자기 궁금해서 물어보게 되었습니다. 물론 차이가 있다는걸 알지만 좀더 명확하게 알려 주실수 있는지 확인하고 싶어서 남겼습니다. ex) template<typename T> T getMax(T x, T y) { return (x > y) ? x : y; } 은 되지만 auto getMax(auto x, auto y) { return (x > y) ? x : y; } 는 안되는걸로 아는데 혹시 다른 부분에 있어서 안되는것이 있는지 궁금해서 질문 남겨드립니다.
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
String 으로 바꿔서 풀었을
앞에서 말씀하신것처럼 문자열 접근은 c가 편하다고 하신게 왜인지 알 것 같습니다ㅠ 주로 했던 언어는 c++이라 c로만 준비하려하니 어색해 서 그런데 c로 이해하고 진도만 먼저 나가도 되는걸까요..? 아니면 c++로 바꿔보는 연습도 해야되는걸까요? 같은듯 다른거 같아서 질문드립니다
-
미해결홍정모의 따라하며 배우는 C++
for-each 반복문에서 값을 바꾸기 위해서..
선생님께서 레퍼런스를 사용하라고 하셨는데, 왜 저는 바뀌어서 출력되죠?ㅠㅠㅠ 아래 코드처럼 작성하면 정상적으로 10이 출력돼요... 항상 좋은 강의 감사합니다~ const int fibonacci[] = { 0,1,1,2,3,5,8,13,21,34,55,89 }; for (int number : fibonacci) { number = 10; cout << number; cout << endl; }
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
아스키코드에 대해서 질문있습니다.
안녕하세요! 궁금한것이 생겨서 질문드립니다! 저는 문제를 처음 봤을때 나이를 나타내는 940909-~~ 의 94를 문자열로 추출해 정수로 바꾸는 방식을 생각했었습니다. 그래서 string 변수에 94 문자를 저장하여 정수로 바꾸는 과정에서 atoi라는 함수가 있더군요 이런 라이브러리의 함수를 사용하면 안되는건가요? 아스키코드로 접근하는것이 더 효율적이라 저렇게 접근하신거고 이렇게 접근해야 코딩테스트의 방향성에 맞는것인가요?
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
출력파일은 output.txt
문제에서 출력파일이름 관련해서 있는데 이건 무시해도 되는건가요?
-
해결됨홍정모의 따라하며 배우는 C++
[1:50]복사생성자를 사용하는 이유
복사생성자 부분을 주석처리하고 Fraction frac(3,5); Fraction fr_copy=frac; 을 디버그해보니 클래스 안으로 들어가지도 않고 바로 복사가 됩니다. 이렇게 해도 복사가 바로 되는데 복사생성자를 사용하는 이유는 무엇인가요? (다음 강의를 보면 이해가 되는건가요?) 1차원적인 질문만 계속하니 쑥쓰럽네요.. 교수님 늘 감사드립니다.