관용적 C ++ 작성법을 어떻게 배울 수 있습니까?


27

나는 컴퓨터 과학 학생이며, 결과적으로 C ++를 수업을 통해 더 나은 C 버전으로 배웠습니다. 복잡한 문제에 대한 해결책이 필요할 때마다 휠을 재발 명하려고 시도합니다. 그 후에 언젠가는 언어 기능이나 표준 라이브러리 루틴이 잠재적으로 저를 위해 할 수 있었을 때만 찾으십시오.

나는 저 char**(int*)(someVoidPointer)관용구에 모두 익숙 하지만 최근에는 오픈 소스 프로젝트에 (사소한) 기여를 한 후에 C ++ 코드를 작성할 때 생각하는 방식이 아니라고 생각합니다. C와는 많이 다릅니다.

객체 지향 프로그래밍을 상당히 잘 알고 있으며 가파른 학습 곡선으로 괜찮다고 생각하면 C ++을 코딩 할 때 C ++ 트랙에 대해 어떻게 생각해야합니까?


7
귀하의 의견을 바탕으로 C ++ 구문을 알고 있습니다. C ++로 코딩하고 있지 않습니다. stackoverflowC ++ 태그 는 시작하기에 좋은 장소이며 읽기 목록FAQ가 포함되어 있습니다. 배우는 유일한 방법은 코드를 작성하고 숙련 된 사용자가 주석을 달도록하는 것입니다. 검토를 위해 여기 에 코드를 넣을 수 있습니다 . 좋은 예
Martin York

1
@LokiAstari의 조언 (동의 함)과 함께, 나는 당신의 친구가 옳다고 말하고 Accelerated C ++를 통해 길을 걷는 것이 좋습니다. 나는 당신이 기대하는 것보다 훨씬 덜 스키밍이 필요하다는 것을 알게 될 것입니다-그것은 이미 프로그래밍을 알고 있고 현대 C ++의 관용구를 배워야하는 당신의 위치에있는 사람들을위한 것입니다.
Jerry Coffin

예 실제로 나는 처음 두 장을 완료,하지만 물건은 내가 이미 알고있는 대부분의 것을 있었다 - 난 그냥 나와서 위해 책을 쓰지 않습니다 저자를 이해 생각 :)이 superinformative 코멘트 @LokiAstari 감사합니다 :)
yati sagade

3
@yatisagade 책이 두 장으로 언어의 정신을 가르치는 것을 기대하지 마십시오. 구문을 이미 알고 있듯이 지루할 수도 있지만 C ++ 서적을 통해 모든 것을 읽고 각 언어를 처음 접할 때마다 연습을하도록 노력해야합니다. 잘못 배운다는 것은 잘못을 잊고 권리 (또는 이와 유사한 것)를 배워야하기 때문에 노력을 두 배로 늘려야한다는 것을 의미합니다.
yannis 2011

1
나는 모두 편안합니다 ...]-(int) (someVoidPointer) 전에 64 비트 빌드를 디버깅 한 적이 있습니까?
Ed S.

답변:


12

귀하의 의견을 바탕으로 C ++ 구문을 알고 있습니다.
C ++로 코딩하지는 않지만 클래스가있는 C라고도합니다.

stackoverflow의 C ++ 태그 는 시작하기에 좋은 장소이며 읽기 목록FAQ가 포함되어 있습니다.

배우는 유일한 방법은 코드를 작성하고 숙련 된 사용자가 주석을 달도록하는 것입니다. 검토를 위해 여기코드넣을 수 있습니다 . 좋은 예

나는 나의 "char *"에 모두 편안하다

사용을 중지하고 std :: string으로 전환하십시오.

및 (int) (someVoidPointer) 관용구.

사용을 중지하십시오 (C 코드와의 인터페이스 제외). functor 개념을 사용하면 몇 가지 장점이 있습니다 (상태 캡슐화 개념 포함).

그러나 최근에는 OSS 프로젝트에 (사소한) 기여를 한 후에 C ++에서 그렇게 생각하지 않는다고 생각합니다. C에는 자체 위치가 있지만 훨씬 다릅니다.

예. C와 C ++는 언어로 분기되었습니다. 실제로 동일한 구문을 사용할 수 있지만 좋은 C 코드로 간주되는 것은 일반적으로 좋은 C ++ 코드로 간주되지 않습니다 (또는 그 반대).

어떤 친구들은 Accelerated C ++를 제안했지만 다시 한 번 타입이 무엇이고 클래스가 무엇이고 오버로드가 무엇인지 알고 있습니다.

당신은 매우 기본적인 사항을 가지고 있습니다.

OO 개념으로 건전한 (손상된) C ++ 프로그래머는 어떻게 언어로 관용적 프로그램을 작성할 수 있습니까?

많은 작업으로 :-)


이것이 유일한 방법은 아닙니다. 좋은 책에서 많은 것을 배울 수 있습니다.
Dima

1
@Dima : 물론입니다. 책에서 많은 것을 배울 수 있습니다. 그러나 경험을 능가하고 분노로 언어를 사용하여 재 시도에 실패하고 다시 실패하는 가장 좋은 방법은 없습니다. 나는 당신이 책에서 프랑스어를 배울 수 있다고 생각하지만 프랑스어가 유창하다고 생각할 것입니다.
Martin York

6
가장 효율적인 학습 방법 인 IMHO는 책부터 시작하여 올바른 방법으로 학습하고 실제로 사용해보고 코드를 비평하는 것입니다.
Dima

@Dima : 나는 그것에 대해 논쟁이 없다.
Martin York

12

Effective C ++ 책 은 많은 흥미로운 것들을 가르치고 C ++ 의 기능을 이해하게 해줄 것입니다. 또한이 효과적인 STL은 - 나는 그것을 읽지 못했어요하지만 난 당신이 성병에 익숙하지 않은 경우 확인이 좋은 읽기 될 것입니다.

배워야 할 중요한 점은 언어를 사용하고 휠을 끊임없이 재발 명하지 않아야한다는 것 입니다. 당신은 이미 그것들을 만드는 법을 배웠으므로, 자신과 다른 사람들을 쉽게 만들고 도구를 사용하여 잠재력을 최대한 활용하십시오.

참고로, STD 사용 을 요구 하는 많은 사람들이 있습니다. 이것은 사용하는 것만큼이나 나쁜 사고 방식입니다. char*때로는 올바른 도구가 아니며 다른 도구가 많이 있습니다. 같은 의미에서 자신 만의 컨테이너 클래스를 만드는 것을 권장하지 마십시오 char*. 가장 좋은 장소를 사용 하려는 경우 클래스 내부에 안전하게 래핑됩니다.


효과적인 시리즈에 대해 알고 있습니다 (읽지 않았습니다). 그러나 모범 사례 문제인 것 같습니다.
yati sagade

3
@yati sagade : 아닙니다. 그 책들은 "C 클래스들"에서 본격적인 C ++로 가야 할 것들입니다.
Dima

실제로 Accelerated C ++ 이후에 Meyers의 효과적인 C ++이 나왔습니다.
yati sagade

1
@Dima "이 책의 목적은 C ++를 효과적으로 사용하는 방법을 보여주기위한 것입니다. 이미 C ++을 언어로 알고 있고 사용 경험이 있다고 가정합니다. 여기서 제공하는 것은 언어를 사용하기위한 가이드입니다. 귀하의 소프트웨어는 이해 가능하고, 유지 보수 가능하며, 휴대 가능하고, 확장 가능하며 효율적이며, 예상대로 작동 할 것입니다 .--효과적인 C ++. 또한 읽을 수있는 많은 "gotchas"도 다룹니다.
Pubby

1
@Dima : 조심하세요. 제 2 판은 C에서 온 새로운 C ++ 프로그래머를 대상으로했다. (최신) 제 3 판은 자바, C # 등의 언어를 사용하는 프로그래머를 대상으로한다.
sbi

6

Herb Sutter가 제공 한 최근 BUILD 테이크를 추천 할 수 있습니다. " 현대 C ++ 코드 작성 : C ++이 수년에 걸쳐 어떻게 진화 해 왔는지 "라는 것이 있습니다 :

많은 사람들이 C ++를 대학에서 경험 한 것과 같은 언어로 생각하거나“클래스가있는 C”와 같이 생각하지만 C ++ 언어는 수년에 걸쳐 광범위하게 발전해 왔습니다. 이 세션에서는 C ++을 사용하여 강력하고 성능이 뛰어난 앱을 제공하는 혁신적이고 표현력이 뛰어나고 아름다운 앱을 작성하는 방법에 대해 설명합니다. 새로 완성 된 C ++ 0x 표준이 다른 많은 언어처럼 C ++를 생산적으로 작성하는 방법을 알아보십시오.

그다지 오래 걸리지 않은 나쁜 표현은 최신 표준의 새로운 기능에 대한 훌륭한 포인터를 제공하므로 이전 C / C ++ 스타일을 업데이트하는 데 대한 힌트를 얻을 수 있습니다.

그 외에는 STL을 배울 필요가 있습니다. 복잡하지는 않으며 효과적인 STL과 같은 많은 책이나 STL 자습서를위한 Google이 있습니다.


+1 감사합니다. 대단했습니다. 이 질문을해서 기쁘다. 너무 많은 멋진 링크 :)
yati sagade

4

Andrew Koenig와 Barbara Moo의 Accelerated C ++ 를 읽고 거의 10 년 동안 C ++을 사용해 본 후 C ++를 가르치는 데 도움이됩니다. (실제로 당시에는 템플릿 메타 프로그래밍으로 고민하기 시작했습니다.) 언어에 대한 새로운 사실을 가르쳐주지는 않았지만 여전히 계시라는 것을 알았습니다. 1

그러나 저에게 가르쳐 준 것은 C ++을 고급 언어로보고 사용하는 것이 었습니다. 원시 포인터를 다루지 않고 delete가능한 경우 표준 라이브러리를 사용합니다.

나는 이것이 당신이 무엇을하고 있는지에 대한 느낌을 가지고 있습니다.

1 당시에는 가르쳐 줄 것이 없었지만 (10 년이 지난 지금도 많지만) 250 페이지 분량의 책으로 짜낼 수있는 지식은 너무나 많습니다.


1

대답하기 전에-참고 : 관용적 C ++은 움직이는 목표입니다. 언어가 바뀌면서 관용구도 변합니다. 실제로 일부 언어 기능은 언어 자체 또는 최소한 표준 라이브러리의 일부 지원으로 단순화되거나 개선 될 수있는 관용적 코드를 제거 할 수 있도록 고안 되었습니다. 따라서 모든 출처는 글을 쓰는 시점에서 관용적 인 내용 만 알려줄 수 있음을 명심하십시오 .

그렇게 말하면 다음을 확인하는 것이 좋습니다.

codereview.SX 사이트

StackExchange 네트워크라는 이름의 사이트가 codereview.stackexchange.com를 . 클래스, 라이브러리의 일부, 지나치게 크지 않은 C ++ 코드를 작성한 경우 거기에 게시하고 커뮤니티에 검토를 요청할 수 있습니다. 코드는 컴파일되고 기본적으로 작동해야합니다. 해당 사이트는 디버깅 용이 아닙니다.

또한 작업중 인 내용과 관련된 C ++ 코드를 검색하고 검토자가 강조하는 내용을 볼 수 있습니다. 답변을 게시하지 않고 게시 된 코드를 직접 검토 한 다음 다른 사람들이 생각한 내용을 읽어 볼 수도 있습니다.

C ++ 컨퍼런스 비디오 프레젠테이션

매년 개최되는 C ++에 초점을 맞춘 몇 가지 개발자 회의가 있습니다.

그리고 이것들 만이 유일한 것은 아닙니다 ... 어쨌든, 이들 각각은 많은 / 모든 프레젠테이션의 비디오를 게시합니다. 이것들은 관용적 코딩과 관용적이지 않아야 할 것을 결정할 수있는 원리를 포함 하여 많은 것을 가르쳐 줄 것 입니다.

때로는 스피커의 슬라이드 데크를 얻을 수도 있습니다.


0

오픈 소스 프로젝트는 아주 좋은 시작입니다. (나는 내 대답에 쓴대로 대학 클래스를 기반으로 전문 프로그래머가 될 것을 기대하지 말라, 그들은 그위한 것이 아닙니다 여기 ).

구문을 알고있는 것 같습니다. 이제 다른 사람들의 코드를 읽고 동료 리뷰를 위해 자신의 공헌을하십시오. 코드를 읽고 이해하고, 디버깅하고 수정하며, 이미 존재하는 코딩 규칙을 준수하여 코드를 추가함으로써 많은 것을 배울 수 있습니다.

전문 서적도 언급 한 바와 같이 매우 좋은 아이디어이며 StackOverflow에서 질문과 답변을 탐색하면 많은 것을 가르쳐 줄 것입니다.


-1

좋은 C ++ 코드를 많이 읽으면 도움이 될 것입니다. 느낌을 얻으려면 코드를 봐야합니다. 다시 말하지만, 대부분의 C ++ 코드는 잘못되었습니다.


"대부분의 C ++ 코드가 잘못되었습니다"-명확히 할 수 있습니까? 대부분의 OSS 프로젝트는 실제로 고품질 표준을 유지하는 것으로 나타났습니다.
yati sagade

1
예, 그러나 프로젝트 수행 방법에 대한 인터넷 검색은 종종 나쁜 예를 초래합니다.
코더

1
@ yati : OSS 프로젝트에 대한 나의 경험은 정반대입니다.
sbi

@sbi 아마-Mozilla 프로젝트와 Chrome에 참여했습니다 (실제로는 관련이 없지만 일종의 학습). 그들의 훈련이 뛰어난 것을 발견했습니다!
yati sagade

@yatisagade : 최소한, 존재하는 대부분의 C ++ 코드는 언어에 좋은 코드를 작성하는 데 필수적인 기능이있을 때 작성되었습니다. 나머지 대부분은 오래된 코드로 작동하도록 작성된 라이브러리를 사용해야하므로이 새로운 코드는 어느 정도 적용되어야합니다. 그리고이 모든 ...에 관계없이 코더 시간과 괜찮은 설계 및 구현에 필요한 노력을 투자 여부입니다
einpoklum - 분석 재개 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.