2012-09-30 2 views
0

나는 C++로 수업을 배웠고 오래된 러시아 책에서 책 클래스에 대한 특정 코드를 얻었습니다. 수정하고 실행했습니다. authour 생성자 내부에서이 코드 (무엇을해야에서는 StrDup합니까?)클래스를 사용하는 방법

Author = strdup(autho);

를 사용하는 간단한 직선 설명과 함께

Book s("edgar", "science", "chemistry for dummies", "502","12.11.13","1.12.96"); 

사람이 코드 줄에 잘못?

using namespace std; 

class Book{ 

    char * Author; 
    char * Type; 
    char * Title; 
    int * Pages; 
    unsigned int * Yearpublished; 
    unsigned int * Publishing; 

    Book(char * autho, char * type, char * title, int * pages, unsigned int * yearpublished, unsigned int * publishing){ 

     Author = strdup(autho); 
     Type = strdup(type); 
     Title = strdup(title); 
     Pages = pages; 
     Yearpublished = yearpublished; 
     Publishing = publishing; 

    } 

    ~Book(){ 

     if(Author != NULL){ 

      free(Author); 

     } 
     if(Type != NULL){ 

      free(Type); 
     } 

     if(Title != NULL){ 

      free(Title); 
     } 
    } 

}; 

int main(){ 

    cout << "main start" << endl; 

    Book s("edgar", "science", "chemistry for dummies", "502","12.11.13","1.12.96"); 

    cout << "main finish" << endl; 
return 0; 
} 
+0

작성하신 내용이 C++가 아닙니다. 모든'char *'줄을 버리고'std :: string'으로 바꾸십시오. – meagar

+0

문자열 작성자와 얼마나 비슷한가요? –

+1

코드를 올바르게 복사했다고 가정 할 때 내가 할 수있는 최선의 조언은 해당 책의 사용을 중단하는 것입니다. 이 코드는 용서할 수 없을 정도로 * 망가졌습니다. 이 코드가 컴파일되어 예상대로 작동하는 C++의 역사에는 아무런 의미가 없습니다. 나는 C++ 코드의 더 나쁜 예제를 생각할 수 없다. – meagar

답변

5

아래

메인 코드는 게시 된 코드를 잘못 많은, 많은 일들이 있습니다. 거의 모든 단일 라인이 오류가있는 많은 것들. 가장 눈에 띄는의

하나는 당신이 int *로 올해를 저장하기 위해 노력하고 "12.11.13"를 포함하는 문자열에 전달하는 것입니다. 그건 작동하지 않습니다. pages에 대해 동일한 작업을 수행 중입니다. int*을 수락하고 int가 포함 된 문자열을 전달합니다. 당신은 그렇게 할 수 없습니다. 그것은 포인터가 작동하는 방식이 아닙니다. 대부분의 포인터 사용은 *이 실제로 무엇인지 모르는 것이므로 매우 소개하기 전에 버그에 대해 코드를 추적하기가 어렵습니다. 연도를 문자열로 저장하거나 (매우 나쁜 생각) unix time에 정수로 저장해야합니다. 이는 매우 표준입니다.

using namespace std을 제거하고 #include <string>으로 바꿔야합니다. char*으로 시작하는 모든 줄을 버리고 std::string으로 바꾸고 int* 줄을 버리고 int으로 만들어야합니다.

또한 개인 생성자 및 소멸자를 선언하고 있습니다. 멤버 변수 선언 다음에 Book() 앞에 public:을 추가해야합니다. 그런 다음 생성자의 본문을 버리고 이니셜 라이저 목록을 사용해야합니다.

<iostream>도 포함되어 있지 않으므로 cout 전화로 인해 오류가 발생했을 수 있습니다.

위 작업을 완료하면 소멸자 ~Book()을 완전히 제거해야합니다. 예를 들어

:

class Book{ 

    std::string Author; 
    // ... 
    int Pages; 
    // ... 

    public: 

    Book(std::string author, /* ... */ int pages /* ... */) 
    : Author(author), Pages(pages) { 

    } 
}; 
3

많은 오류가 있습니다.

1) 포인터가 너무 많습니다. 이 스 니펫 코드에서는 포인터 하나도 필요하지 않습니다. meagar가 지적한대로 char*std::string으로 바꿀 수 있습니다. 정수 나 부호없는 정수에 대한 포인터가 필요 없으므로 유형을 그대로 사용할 수 있습니다.

2) 생성자를 호출 할 때 숫자 대신 문자열 (""따옴표 사용)을 전달하고 있습니다. 숫자를 전달하려면 따옴표를 사용하지 마십시오.

3) "using namespace std"를 사용하고 있는데 그 이유는 여러 가지 이유로 잘못 되었기 때문에 많은 웹 사이트에서 여러 번 설명되어 왜 검색 할 수있게되었습니다.

4) 당신은 당신이 (우리는 newdelete이 있기 때문에 그조차 ++ C에서 제시되지 않을 것이다) malloc() 할당되지 않은 메모리에 free() 사용하고 있습니다.

편집 :이 코드가 C++의 책에서 가져온 코드 인 경우, 그 이상의 가치가 없으므로이 책을 화재 시동 장치로 사용하십시오.

여기에 많은 C++로 작성된 간단한 코드 버전이 있습니다.

#include <iostream> 
#include <string> 

class Book 
{ 
private: 
    std::string Author, Type, Title, Publishing; 
    unsigned int Pages, Yearpublished; 

public: 
    Book(const char* autho, const char* type, const char* title, unsigned int pages, 
     unsigned int yearpublished, std::string publishing) 
    { 
     Author = strdup(autho); 
     Type = strdup(type); 
     Title = strdup(title); 
     Pages = pages; 
     Yearpublished = yearpublished; 
     Publishing = publishing; 
    } 

    ~Book() 
    { 

    } 

}; 

int main() 
{ 
    std::cout << "main start" << std::endl; 
    Book s("edgar", "science", "chemistry for dummies", 502, 2012,"1.12.96"); 
    std::cout << "main finish" << std::endl; 

    return 0; 
} 

아직 개선해야 할 것이 많지만 최소한 컴파일하고 실행하면됩니다.

+0

+1은 책을 얼얼 링으로 사용하도록 권합니다. "심술 궂다")는 책을 버리고 다시 시작하라고 대답 한 나의 대답을 삭제했다. –

1

나는 귀하의 질문에 조금 혼란 스러워요하지만 난 당신이 주로 strdup 무엇을 요구 생각 :

이 복사 전달 된 문자열을 새로 하나를 생성 jsut에 대한 포인터를 반환합니다. 소멸자에서 할당 된 문자열이 있으면이를 파괴합니다.

관련 문제