우분투에서 C++ 프로그래밍에 대해서 질문드립니다.

interoasis의 이미지

우분투에서 처음 C++ 프로그래밍을 해보는데 책이 오래된거여서 그런지 맞지않는 몇가지가 있네요.
C++이 처음에 나왔을때랑 문법이 많이 바뀌었나봐요?

책에는 iostream.h라고 나오는데 컴파일시 에러뜨길래 검색해보니 iostream으로 해야한다고,,
거기에 무슨, using namespace std; 구문을 넣어줘야 한다고 하구요.

거기다 책에서 나오는 예제를 그대로 옮겨썼는데 이것역시 제대로 컴파일이 안되더군요.

#include <string>
#include <iostream>
using namespace std;
 
const int max_len = 255;
 
class string {
public:
        void assign(const char* st)
                { strcpy(s, st); len = strlen(st); }
        int length() { return len; }
        void print() { cout << s << "\nLength: " << len << "\n"; }
private:
        char s[max_len];
        int len;
};
 
int main()
{
        string one, two;
        char three[40] = {"My name is Charles Babbage."};
 
        one.assign("My name is Alan Turing.");
        two.assign(three);
        cout << three;
        cout << "\nLength: " << strlen(three) << endl;
 
        if(one.length() <= two.length())
                one.print();
        else
                two.print();
}

위가 코드의 전문인데 어떤부분이 잘못된걸까요? 에러메세지를 보니 strcpy와 strlen함수가 선언되지 않았고 string의 언급이 애매하다? 그리고 one과 two가 선언되지 않았다라는 내용이네요. 그리고 또하나 궁금한점은 헤더파일 string은 이 아니고 이 맞나요? 둘다 해도 에러뜨긴 합니다만..

그래도 우분투가 리눅스라 프로그래밍적인 부분에서는 좀 더 편할 줄 알았는데 c++부터는 뭔가 더 불편한 느낌이네요.

ktd2004의 이미지

컴파일해 보지는 않았습니다.~~

#include <string>
#include <iostream>
#include <cstring>
using namespace std;
using std::string;
using std::strcpy;
using std::strlen;
 
...
interoasis의 이미지

딱 하나의 에러가 남았네요. struct std::string 이 print라는 멤버를 가지고 있지 않다고...
분명 spring클래스안에 print라는 member function이 존재하는데 말이죠;;

그나저나 그 많은 에러들이 위의 구문을 선언해주지 않은거라 그런거였다면 리눅스에서 C++ 프로그래밍은
참 번거로운 작업이군요. -_-;; C프로그래밍 할때만해도 신경쓸게 없었는데 말이죠.. 쩝;;

cleol의 이미지

> 그나저나 그 많은 에러들이 위의 구문을 선언해주지 않은거라 그런거였다면 리눅스에서 C++ 프로그래밍은
> 참 번거로운 작업이군요. -_-;; C프로그래밍 할때만해도 신경쓸게 없었는데 말이죠.. 쩝;;

리눅스뿐만 아니라 어디서든 마찬가지입니다. C++ 은 상당히 verbose 한 언어입니다. 타이핑 양이 많지요.

> 분명 spring클래스안에 print라는 member function이 존재하는데 말이죠;;

위 코드에서 one, two 는 작성하신 string 의 instance 가 아니고, 표준 라이브러리에 있는 std::string 의 instance 입니다.
print 가 없는 게 당연하지요. 아마도 string 을 다시 정의할 수 없다고 에러가 뜰텐데요?
여하튼 여러모로 좋은 예제가 아닙니다. 그냥 이 코드는 잊어버리시고, 새 책으로 공부하세요^^

interoasis의 이미지

한번 괜찮은책있나 여기서 찾아봐야겠네요. 감사합니다. :)

bluekyu의 이미지

#include <string>을 지우세요

예제는 직접 만드신 string 클래스를 사용하는 것 같은데, 그러면 표준 string 클래스는 있을 필요가 없죠.

또, using std::string 도 마찬가지로 지우시고요.

/*** Signature ******************
* blog: http://blog.bluekyu.me/ *
********************************/

interoasis의 이미지

아마도 string헤더파일을 집어넣은 이유는 string클래스 안에서 쓰인 스트링관련함수들을 갖다쓰기위함이 아니었을까요? strlen이라던지 substr이라던지요.. 말씀하신대로 해봤지만 에러메세지가 늘어나버리네요ㅎㅎ;

다른분들말씀처럼 새 책을 사서 배워야할것 같아요. 조언 감사드립니다.^^

bluekyu의 이미지

아 그거는 cstring 파일에 있습니다.

그리고 덧붙여서 using namespace std; 대신 using std::cout; 와 using std::cin;을 사용하세요

using namespace std;를 쓰면 표준 string 쪽과 혼동된다고 뭐라 합니다.

ps. 컴파일 해봤습니다.

#include <cstring>
#include <iostream>
 
using std::cout;
using std::endl;
using std::strlen;
using std::strcpy;

/*** Signature ******************
* blog: http://blog.bluekyu.me/ *
********************************/

interoasis의 이미지

말씀대로 하니까 제대로 컴파일됩니다. 정성들인 답변해주셔서 감사합니다.^^
C++프로그래밍은 좀더 최신의 정보를 가지고 공부를 해야겠네요.

cleol의 이미지

> 책에는 iostream.h라고 나오는데 컴파일시 에러뜨길래 검색해보니 iostream으로 해야한다고,,
> 거기에 무슨, using namespace std; 구문을 넣어줘야 한다고 하구요.

그 책 버리십시오. 최근에 나온 책으로 다시 사는 것이 좋겠습니다.
말씀하신 내용으로 봐서는 표준이 완성되기 전에 나온 책인 것 같습니다.
여기서 검색해보시면 C++ 책에 대한 추천을 많이 찾으실 수 있을 겁니다.

interoasis의 이미지

원래 C++책이 아니라 1학년때 C언어 교재로 사용했던 책입니다. C++내용은 끝부분에 살짝 다루고있죠.
여기의 C언어 내용들은 지금에 사용해도 별 문제가 없습니다만(이미 ANSI C가 나온후에 나온책이라서 그런걸까요?)
C++ 내용은 문제되는게 좀 있네요. 번역본 출판년도가 2000년이니, 98년에 표준이 생긴 C++내용을 반영하기가 어려웠던것일까요?

그래도 꽤 유명한 책인데 말이죠. A Book on C라고...

p.s : 헐... 혹시나해서 다른 C책이 있어서 그책을 살펴봤는데 거기에도 iostream.h라고 나오는군요.-_-;; 무슨 저는 고서(!)들만 가지고 있나봅니다. 요건 2002년판."Teach Yourself C" :)

klyx의 이미지

문법이 바뀐게 아니라 표준 라이브러리가 바뀐것입니다.
다음 페이지 중간쯤에 경위가 간단하게 소개되어있습니다.
http://www.winapi.co.kr/clec/cpp3/25-2-2.htm

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.