월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 C++
익명 객체에서 생성자와 getCents함수에 대해 궁금한 점이 있습니다.
#include <iostream> using namespace std; class Cents { private: int cents_; public: Cents(const int& cents) : cents_(cents) { cout << "Constructor" << endl; } const int& getCents() const//뒤에 const를 붙여준 이유는 함수 오버로딩 { return cents_; } }; Cents add(const Cents& c1, const Cents& c2) { return Cents(c1.getCents() + c2.getCents());//Cents 생성자 호출 } int main() { cout << add(Cents(6), Cents(8)).getCents()<< endl; //인자로 하는 생성자 각각 호출 return 0; }교수님께서는 getCents함수에서 반환형에서 참조자를 붙이지 않고 뒤에 const만 붙였는데요. 이러면 return by value가 되서 복사된 값을 반환하는 것이 아닌가요? 멤버변수 그 자체를 반환하고 값이 변경되는 것을 방지하기 위해서는 반환형에 const int&를 붙여야 하지 않나요??
- 미해결홍정모의 따라하며 배우는 C++
10.6 컨테이너 클래스 숙제 피드백
안녕하세요 강의를 듣고있는 학생입니다.10.6에서 컨테이너 클래스의 개념을 설명해주시고IntArray를 직접 구현해보는 숙제를 내주셔서 직접 머리를 짜내서 코드를 구현해봤습니다.이 글을 보신 숙련자 분들께 제가 구현한 intArray를 피드백 받고싶어서 글을 작성합니다.#include <iostream>#include <vector>using namespace std;class IntArray{private: int m_length = 0; int* m_data = nullptr; public: IntArray(const int 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& ele : list) { //cout << "list" << endl; m_data[count] = ele; count++; } } ~IntArray() { delete[] m_data; } void initialize(const std::initializer_list<int>& list) { delete[] m_data; m_length = list.size(); m_data = new int[m_length]; if (m_data != nullptr) { int count = 0; for (auto& ele : list) { m_data[count] = ele; count++; } } } void reset() { delete[] m_data; m_data = nullptr; } void resize(const int size) { m_length = size; } void insertBefore(const int & value, const int & ix) { m_length += 1; int *n_data = new int[m_length]; int i = ix; for (int n = 0; n < ix; n++) n_data[n] = m_data[n]; n_data[ix] = value; for (i; i < m_length; i++) { n_data[i + 1] = m_data[i]; } delete[] m_data; m_data = n_data; } void remove(const int& ix) { m_length -= 1; int* n_data = new int[m_length]; int count = ix; for (int i = 0; i < ix; i++) { n_data[i] = m_data[i]; } for (count; count < m_length; count ++) { n_data[count] = m_data[count+1]; } delete[] m_data; m_data = n_data; } void push_back(const int& value) { this->m_length += 1; int* n_data = new int[m_length]; for (int i = 0; i < m_length; i++) n_data[i] = m_data[i]; n_data[m_length-1] = value; delete[] m_data; m_data = n_data; } friend ostream& operator << (ostream& out, IntArray& ia) { for (int i = 0; i < ia.m_length; i++) out << ia.m_data[i] << " "; out << endl; 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(2); cout << my_arr << endl; my_arr.push_back(13); cout << my_arr << endl; my_arr.initialize({ 1, 2, 3 }); cout << my_arr << endl; return 0;}피드백 받고싶은 이유는 함수를 구현할 때 Array에 int를 추가, 삭제, 수정을 할때새로 동적할당을 받은 뒤에 그 공간에 기존 데이터를 복사해주며 추가,삭제,수정 해줄 부분을 해주고기존 동적할당 공간은 지우고 기존 객체가 가르키는 포인터를 새로 할당한 공간으로 설정 해주었습니다. 선생님 께서 예시로 작성하는 코드 짜임새와 코드라인수에 비해제 머리속에서 나온 그대로를 코드로 담은거라 너무 조잡 난해하다는 생각이 들었습니다.그래서 코드를 더 간단하게 짜려면 이 내용을 어떤식으로 수정하면 좋을지 피드백 받고싶습니다.혹은 코드에 아쉬운점들을 고수분들의 관점으로 보고 말씀해주시면 배워보고싶습니다 감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
15.4 std::move
#pragma once#include<iostream>template <class T>class AutoPtr{public:T *m_ptr = nullptr;AutoPtr(T *ptr = nullptr): m_ptr(ptr){std::cout << "auto default constructor" << std::endl;}~AutoPtr(){std::cout << "autoptr destructor" << std::endl;if ( m_ptr != nullptr )delete m_ptr;}Autoptr(const AutoPtr &a){std::cout << "autoptr copy constructor" << std::endl;//deep copym_ptr = new T;m_ptr = a.m_ptr;}AutoPtr &operator = (const AutoPtr &a){std::cout << "autoptr copy assignment" << std::endl;if ( &a == this ) return *this;if ( m_ptr != nullptr ) delete m_ptr;m_ptr = new T;m_ptr = a.m_ptr;return*this;}//AutoPtr(const AutoPtr &a) = delete;//AutoPtr &operator=(const AutoPtr &a) = delete;AutoPtr(AutoPtr &&a):m_ptr(a.m_ptr){a.m_ptr = nullptr;std::cout << "AutoPtr move constructor" << std::endl;}AutoPtr &operator=(AutoPtr &&a){std::cout << "autoptr move assignment" << std::endl;if ( &a == this )return*this;if ( !m_ptr )delete m_ptr;m_ptr = a.m_ptr;a.m_ptr = nullptr;return*this;}T &operator*()const { return *m_ptr; }T &operator->()const { return m_ptr; }bool isNull()const { return m_ptr == nullptr; }};#pragma once#include<iostream>class Resource{public:int *mData = nullptr;unsigned mLength=0;Resource(){std::cout << "default constructed" << std::endl;}Resource(unsigned length){std::cout << "resource length constructed" << std::endl;this->mData = new int[length];this->mLength = length;}Resource(const Resource &res){std::cout << "copy constructed" << std::endl;Resource(res.mLength);for ( unsigned i = 0; i < mLength; i++ ){mData[i] = res.mData[i];//deep copy}}Resource &operator=(Resource &res){std::cout << "copy assignment" << std::endl;if ( &res == this )return *this;if ( this->mData != nullptr )delete[]mData;mLength = res.mLength;mData = new int[mLength];for ( unsigned i = 0; i < mLength; i++ ){mData[i] = res.mData[i];}return *this;}~Resource(){std::cout << "resource destroyed" << std::endl;if ( mData!=nullptr ){delete[]mData;}}void Print(){for ( unsigned i = 0; i < mLength; i++ ){std::cout << mData[i] << " ";}std::cout << std::endl;}};#include"autoPtr.h"#include"resource.h"int main(){using namespace std;AutoPtr<Resource> res1(new Resource(10000000));cout << res1.m_ptr << endl;AutoPtr<Resource> res2 = res1;cout << res1.m_ptr << endl;cout << res2.m_ptr << endl;}코드를 따라친거 같은데AutoPtr<Resource> res2 = res1;이부분에서 컴파일에러가 납니다 강의에서 코드를 빨리 넘겨서 잘 안보여서 어떤게 에러인지 모르겠습니다
- 미해결홍정모의 따라하며 배우는 C++
이거 그냥 []연산자 오버로딩이 맞나요?
(사진)
- 해결됨홍정모의 따라하며 배우는 C++
return *this에 관해 질문이 있습니다.
*this가 멤버변수를 참조한다는 것은 알겠는데 왜 그냥 this를 리턴하면 저 오류가 뜨는지 모르겠습니다.this도 인스턴스화된 객체를 가리키는 포인터니까 좌값이 맞지 않나요? 아니면 인스턴스의 주소가 우값에 속해있는 건가요??
- 미해결홍정모의 따라하며 배우는 C++
안녕하세요 위임 생성자 강의를 듣는 도중에 궁금한 점이 생겼습니다.
위임 생성자가 매개변수에 값을 입력 안했을 때, 클래스를 다시 참조해서 사용자가 입력한 값을 인스턴스에서 출력하는 것이잖아요?? 가령, Student(const string& name_in) : Student(0, name_in) {} 와 같이요.그런데 잘 생각해보면 디폴트 매개변수 생성자도 매개변수에 미리 값을 설정해주고, 인스턴스 인자에 값을 안넣어주면 디폴트값을 출력하는 것도 같은 원리인데 차이점이 무엇인가요??
- 미해결홍정모의 따라하며 배우는 C++
메모리가 새고 있는 지 확인하는 방법
while (true) { int* ptr = new int; cout << ptr << endl; } // 메모리가 새고 있는 지 확인법 // 1. Task manager에서 메모리 사용량이 무한히 올라가면 메모리가 새고 있는 것 // 2. ..? 메모리가 새고 있는 지 확인하는 방법은 2가지가 있다고 하셨는데 제가 캐치를 못했는지 하나밖에 모르겠어요ㅠㅠ 다른 방법은 무엇이 있나요?
- 미해결홍정모의 따라하며 배우는 C++
delete 후 주소값
int *ptr = new int (7); cout << ptr << endl; // 000001879A455E70 cout << *ptr << endl; // 7delete ptr; cout << ptr << endl; //0000000000008123 // 강의 내에서는 위의 ptr과 아래의 ptr이 같은 주소값으로 출력되는데 저는 안그렇습니다. 왜이런걸까요?
- 미해결홍정모의 따라하며 배우는 C++
컴파일시 exe 파일이 생성이 안되네요
강의에서는 코드 작성 후 실행을 누르면 exe파일이 생성된 경로로 cmd창에서 이동 후 명령어로 코드를 실행시키는데저는 실행을 눌러도 exe파일이 생성이 안되고 exe.recipe라는 파일만 보이는데 혹시 설정을 다르게 해야하나요?그리고 혹시 컴파일과 빌드의 용어의 차이점을 설명해주실수 있으실까요? 강의에서는 cmd창을 비쥬얼스튜디오용? cmd창을 사용하는것 같은데 그냥 윈도우에서 cmd검색시 나오는 기본 명령프롬프트와는 어떻게 다른건가요?
- 미해결홍정모의 따라하며 배우는 C++
문자열내의 개행문자 출력방법
위 코드를 실행시 아래와 같은 결과가 나왔습니다.강의 예제처럼 n_name의 값은 10이 나옵니다.1,2는 예상대로 나왔는데, 3,4,5는 강의예제와 달리 개행문자가 출력이 되지 않았습니다.visual studio 2022 community를 사용하였는데, 개행문자는 출력하지 않는 옵션이 있는 건가요?
- 미해결홍정모의 따라하며 배우는 C++
for (const auto &number : fibonacci), &유무의 차이점?
int main(){ int fibonacci[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 }; for (auto& number : fibonacci) number *= 10; //for (const auto number : fibonacci) for (const auto &number : fibonacci) cout << number << " "; // -------1) cout << endl; return 0;}1) 라인에서 number 값을 변경없이 출력만 하고 있습니다.이 경우 for문에서 number와 &number의 차이가 있을까요? 두 경우 모두 fibonacci 배열의 값을 변경하지 않으면 그냥 number를 쓰는 것이 나을까요?
- 미해결홍정모의 따라하며 배우는 C++
클래스의 멤버함수에 대해
같은 클래스로 만들어진 인스턴스들은 해당 클래스의 멤버함수가 담긴 하나의 메모리만을 사용한다고 이해해도 되나요? 각자의 함수를 따로따로 메모리에 담고 있지는 않는다고 앞에서는 설명해주셨던거 같은데 이번강의에서도 개념은 똑같은것 같아서요
- 미해결홍정모의 따라하며 배우는 C++
언리얼엔진 c++에서
언리얼엔진에서 한 클래스 안에 public privatepublic 이런식으로 퍼블릭나왔다 프라이빗 나왔다가 퍼블릭 나왔다가 이렇게 되어 있는 경우를 봤는데 다를게 없는걸로 봐도 되죠?
- 미해결홍정모의 따라하며 배우는 C++
인스턴스 객체 클래스 오브젝트 정리
데이터와 기능이 묶여있는 것이 Object이고 object랑 객체는 같은 말이고 이런 오브젝트종류중에 하나가 클래스이며 클래스로 오브젝트를 찍어낼 수 있고 이렇게 찍어낸 것들이 인스턴스인게 맞나요? 용어 정리를 명확히 하고 싶네요!
- 미해결홍정모의 따라하며 배우는 C++
12.7 순수 가상 함수
강의가 잘 이해가 안가는데요이번 강의는 이해되는거 같으면서도 좀 애매하네요 ㅠclass IErrorLog {public:virtual bool reportError(const char *errorMessage) = 0;virtual ~IErrorLog(){}}; void doSomething(IErrorLog &log){log.reportError("runtime error!!");} doSomething에서 runtime error이거는 왜 쓴건가요?? 아무 말이나 써도 영향을 안주는 거 같아서요 어차피 dosomthing의 매개변수가 추상클래스 (IErrorLog)면 reportError 매개변수로 뭘 써놔도 의미없는게 맞나요?? 아니면 다른 용도가 있는 건가요? 디버깅에서는 그냥 들어갔다가 derivedclass의 override된 함수의 매개변수가 들어가면서 사라지던데요
- 해결됨홍정모의 따라하며 배우는 C++
형변화 오버로딩을 어떤식으로 이해해야 할지모르겠습니다.
안녕하세요. 9.8 형 변환 강의를 듣던 중 이해가 되지 않는 부분이 있어서 질문합니다.19~23줄에 있는 int형 변환 함수에 리턴타입이 없는이유가 궁금합니다.함수가 클래스 내부변수에 이미 멤버로 정의가 되어있어서 변수에 접근할 수 있기 때문에 따로 리턴타입을 정의하지 않은건가요? 19줄 operator int 뒤에 있는 ()의 의미가 궁금합니다. 예를 들어 아래는 9-6 수업 첨자연산자 오버로딩의 예 입니다.int& operator [] (const int index) { return m_list[index]; }그런데 이경우는 매개변수도 정의가 되어있고 리턴타입도 정의가 되어있어서 [ ] 안에 값을 넣음으로서 이러한 기능이 작동하는것으로 알고있었습니다. 그런데 19줄은 매개변수가 없어서 int뒤에오는 ()가 매개변수를 담는 ()인지 아니면 위 예에서 [ ]같이 사용되는것인지 모르겠습니다. [ ] 처럼사용되는것이라면 47줄에는 ( )안에 Cents가 아닌 int가 들어가있는데 어째서 정상작동하는것인지 모르겠습니다.앞서 1,2번의 궁금증을 해결하기보다는 그냥 오버로딩이 이러한 형식으로 작동하고 47~49줄 처럼 형태는 다르지만 오버로딩을 배우기전 알고있던 기본적인 형변환방식에 모두 적용이된다 라고만 이해하고있으면 될까요?
- 미해결홍정모의 따라하며 배우는 C++
파라미터로 넣은 참조를 함수가 바꾸지 못하게 막는건
목적이 파라미터로 넣은 값은 그대로 유지 하면서 함수의 return값도 따로 받고 싶어서 그러는 건가요? return값도 사용하고 파라미터로 넣은 참조값도 그대로 사용하고 싶어서??
- 해결됨홍정모의 따라하며 배우는 C++
9:23부터 리턴값을 자기자신의 래퍼런스를 지정한다고 들었는데 정확히 *this가 어떤 타입인지 모르겠습니다.
9:23 부터 리턴값으로 인스턴스의 래퍼런스를 지정한다고 이해했습니다.그러면 *this는 정확히 어떤타입인건가요?*는 포인터에서 가리키는 주소의 값에 접근할수있는 연산자라고 이해했습니다. this가 인스턴스의 주소를 가리키는 포인터이니 *this는 Calc 클래스내부의 변수 m_value의 값인 건가요? 그렇다면 Calc&는 int형을 반환하는 리턴타입이라고 봐도 무방할까요?
- 미해결홍정모의 따라하며 배우는 C++
6.3 배열과 반복문 const 관련 질문입니다.
다른 질문에서 배열의 크기는 const 상수로 컴파일 크기를 통해서 정해줘야한다는 답변은 이해했습니다!그런데 int scores[] = { ...}; 는 올바른 형식이잖아요?그렇다면 배열의 크기는 알아서 설정이 되었다고 생각됩니다.그래서, 여기서 num_students에 const를 하신 이유가 궁금합니다.여기서의 num_students는 배열 정의시에 들어가지 않고 for문에서 단순 조건문에 들어갈 뿐인데, const를 한 이유가 궁금합니다!. 제가 cosnt를 빼고 실행했을때도 실행이 되더라구요!.처음에 배열 사이즈 변수로 넣으려고 할 때 const가 붙여있어서 그랬던 것이고, 나중에 다른 케이스 변경하면서 굳이 지우지 않았던 것인가요?감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
06:55질문
06:55 에서 static const double pi=3.141592;를 헤더로 따로 나눈다고 하셨는데요그럼 해당 헤더파일을 사용하는 cpp파일마다 해당 변수의 메모리를 따로 만들어지니까 별로 안좋지 않나요??