본문 바로가기

C++34

[Error,C++]Expression must be a modifiable lvalue 해결법 코딩하다 "Expression must be a modifiable lvalue" 오류가 가끔 뜬다. 직역하면 "표현식은 수정할 수 있는 lvaue이어야만 한다."라는 뜻이다. 여기까지 찾아왔다면 무슨 소리인가??? 무엇을 잘 못 썼다는 말인 거 같은데 난 잘 못 쓴 게 없다는 분들이 대다수라 생각한다. 하지만 결론적으로 잘못 쓰셨다. 표현식을 하나하나 찬찬히 뜯어보시길 바란다. 저 또한 같은 생각을 했고 다시 실수하지 않기 위해 이글을 쓴다.. 그래도 여기서 바로 알고싶다는 분들을 위해 stackoverflow에 있는 사례를 하나 들겠다. int M = 3; int C = 5; int match = 3; for ( int k =0; k < C; k ++ ) { match --; if ( match ==.. 2020. 5. 25.
[C++] class의 메모리 할당방법 (virtual 멤버함수, 일반멤버함수, 상속) 여러 가지 class의 메모리 할당에 대해 알아보겠습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include using namespace std; class Person{ public: char name; char address; }; int main() { Person gildong; cout 2019. 11. 5.
[C++] 공백이 포함된 문자열 입력받기(char array, string : getline) C, C++에서 입력을 받을 때 "공백이 포함된 문자열"을 입력받는 법을 소개한다. Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include #include using namespace std; int main(){ //string string str; getline(cin, str); //getline(cin, str, '\n'); cout 2019. 10. 23.
[C++] 문법 char to string , string to char 변환 문법 char to string , string to char 변환 1. char to string으로 변환하는 방법 string의 생성자를 이용, 생성 할 때 인자로 넘겨서 생성하는 방법 char배열의 이름을 사용해 대입연산자를 이용해 대입해주는 방법 2. string to char로 변환하는 방법 c_str()함수를 이용 해 string을 char로 변환시키고 그 값을 strcpy를 이용, 다른 char값에 복사하는 방법 EXAMPLE #include #include using namespace std; int main(){ //char to string char ch[10] = "hello"; string str1(ch); string str2=" "; str2=ch; cout 2019. 10. 16.
[C++, STL] <algorithm> std::fill 함수 사용하기 (feat. std::vector, 1차원 배열, 2차원 배열 초기화) std::fill 1 2 template void fill (ForwardIterator first, ForwardIterator last, const T& val); cs 헤더파일에 저장되어 있다. 값으로 범위(first, last)를 채우는 역할을 하는 함수이다. 인자 (Parameters) first, last val의 값으로 채울 범위를 나타내는 반복자들 [first, last)범위에 값이 채워지게 된다. first는 포함하지만 last는 포함하지 않는다. val 범위에 채울 값 리턴값 (return value) 없다. 예제 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253.. 2019. 9. 25.
[Error, VS] E0077 이 선언에는 저장소 클래스 또는 형식 지정자가 없습니다. Visual studio를 사용하다 "E0077 이 선언에는 저장소 클래스 또는 형식 지정자가 없습니다. "와 같은 오류가 발생하는 경우가 있다. 구글 신께 물어보니 코드상에서 사용하려는 클래스 또는 타입들을 컴파일러가 인식할 수 없다는 의미이다. 헤더 파일 including 문제이므로 경로 설정이 올바르게 되었는지 확인해야 할 것이다. 라고 답변을 하는데 나 같은 경우에는 헤더파일 문제가 아니었다. 원인을 파악해보니 코드를 인터넷에서 복붙 하는 경우 VS가 인식할 수 없는 특수문자가 포함되는 경우가 있다. 이 경우 오류가 나는 위쪽 코드를 Error가 없어질 때까지 지웠다가 다시 타이핑해보길 바란다. 2019. 9. 23.
[Error, VS] C1001 컴파일러에서 내부 오류가 발생했습니다. syntax 에러도 아닌 흔치않은 컴파일러 오류라서 포스팅한다. 해결법은 간단하다. 다시 빌드 버튼을 눌러 다시 빌드해주면 된다. 윗 사진을 참고하기 바란다. 2019. 9. 23.
[Effective C++] 항목 19 : 클래스 설계는 타입 설계와 똑같이 취급하자. 오늘은 클래스 설계를 할 때 고려해야할 사항에 대해 알아보도록 하자. 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가? 이부분이 어떻게 되느냐에 따라 클래스 생성자 및 소멸자의 설계가 바뀐다. 객체 초기화는 객체 대입과 어떻게 달라야 하는가? 각각 생성자와 대입 연산자에 의해 이루어지기 때문에 중요한 요소라 할 수 있다. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가? 여기서 잊지말아야 할 포인트는 값에 의 한 전달을 구현하는 것은 바로 복사생성자라는 것이다. 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 잡을 것인가? 기존의 클래스 상속 계통망에 맞출 것인가? 어떤 종류의 타입 변환을 허용할 것인가? 어떤 연산자와 함수를 두어야 의미가 .. 2019. 8. 1.
[Effective C++] 항목 11 : operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자. 오늘부터는 가독성을 위해 제일 처음에 요약부분을 넣도록 하겠다. 요약 operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자. 원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정할 수도 있으며, 복사 후 맞바꾸기 기법을 써도 된다. 같은 맥락으로 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 같은 객체인 경우에 정확하게 동작하는지 확인해 보자. 자기 대입이란? 어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것을 말한다. 오늘은 자기대입의 경우 발생할 수 있는 예외처리에 대해 알아본다. Widget& Widget::operator=(const Widget& rhs) { delete pb; pb = .. 2019. 7. 25.
[Effective C++] 항목 10 : 대입 연산자는 *this의 참조자를 반환하게 하자 오늘은 쉬어가는 타임으로 비교적 간단한 주제를 다루려고 한다. 알다싶히 C++의 대입 연산은 여러 개가 사슬처럼 엮일 수 있는 재미있는 성질을 갖고 있다. x = y = z = 15; 위의 코드는 아래와 같이 우측 연관 연산이라는 사슬로 이어진다. x = (y = (z = 15)); 위와 같은 결과가 나오려면 대입 연산자가 좌변 인자에 대한 참조자를 반환하도록 구현되어있다는 의미이다. class Widget { public: Widget& operator= (const Widget& rhs) { return *this; } }; 위의 class가 = 가 아닌 +=,-=,*= 등 매개변수 타입이 일반적이지 않은 경우에도 동일한 규칙이 적용된다. 오늘은 이것으로 끄웃~ㅎㅎ 2019. 7. 24.
[Effective C++] 항목 9 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 오늘의 주제는 생성자 혹은 소멸자 안에서 가상 함수를 호출하지 말자! 이다. 파생클래스안의 생성자 소멸자에서 라는 중요한 문장이 빠져있다. 기본클래스나 파생클래스에서 실제로 생성자 혹은 소멸자 안에서 가상함수를 호출하게되면 컴파일에러가 난다. ( 비주얼스튜디오 컴파일러는 그렇다.) 왜나하면 파생클래스 객체의 기본 클래스 부분이 생성되는 동안은, 그 객체의 타입은 바로 기본클래스라는 점이다. 따라서 호출되는 가상 함수는 모두 기본 클래스의 것으로 결정(resolve)될 뿐만 아니라 런타임 타입 정보를 사용하는 언어 요소(dynamic_cast, typeid)를 사용한다 해도 이 순간엔 모두 기본 클래스 타입의 객체로 취급한다. 소멸자도 마찬가지 같은 의미로 생성자의 일반 함수에서 가상함수를 호출하는 경우도.. 2019. 7. 23.
[Effective C++] 항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자. 오늘은 두번째 시간! 오늘은 소멸자에서 예외가 발생할 경우를 대비해 예외처리를 잘 해주자에 대해서 이야기한다. 데이터베이스의 연결이 항상 닫히도록 하는 함수를 db.close라고 하자. 그러면 소멸자에 db.close라는 함수를 작성하면 된다. 하지만 db.close에서 오류가 발생할 경우 즉, 연결을 닫다가 오류가 발생하면 문제가 발생한다. 메모리 누수등 여러 문제가 발생할 수 있기 때문에 try catch로 프로그램을 바로 끝내는 코드를 작성하자는 것이다. 하지만 필자는 다음과 같은 코드가 제일 좋다고 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class DBconn { public: void close(){ db.close(); closed = tr.. 2019. 7. 22.