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;
}
4

3 に答える 3

5

投稿されたコードには多くの問題があります。事実上すべての行にエラーがあるほど多くのことがあります。

最も明白なものの1つは、年を。として格納し、int *次に。を含む文字列"12.11.13"を渡そうとしていることです。それはうまくいきません。あなたはpages;についても同じことをしています。を受け入れ、intを含むint*文字列を渡します。あなたはそれをすることはできません、それはポインタがどのように機能するかではありません。ポインターの使用法のほとんどは、何をするのか本当にわからないことを示しています。コードにバグを追跡するのが非常に難しい場合は、ポインターを停止して読む必要があります。年を文字列として保存するか(非常に悪い考え)、UNIX時間で整数として保存する必要があります。これはかなり標準的です。*

削除using namespace stdして、に置き換える必要があり#include <string>ます。で始まるすべての行を破棄しchar*、それらを置き換えてstd::stringint*行を破棄して作成する必要がありますint

また、プライベートコンストラクタとデストラクタを宣言しています。public:メンバー変数宣言の後、前に追加する必要がありますBook()。次に、コンストラクターの本体を破棄し、初期化子リストを使用する必要があります。

また、を含めていない<iostream>ため、cout呼び出しによってエラーが発生している可能性があります。

上記を実行したら、デストラクタを~Book()完全に削除する必要があります。

例えば:

class Book{

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

    public:

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

    }
};
于 2012-10-01T00:00:39.087 に答える
3

そこには多くのエラーがあります。

1)使用しているポインタが多すぎます。このコードスニペットには、ポインターは1つも必要ありません。meagarが指摘しているように、で置き換えることができchar*ますstd::string。整数または符号なし整数へのポインタは必要ありません。タイプはそのまま使用できます。

2)コンストラクターを呼び出すときに、数字の代わりに文字列(引用符 ""を使用して示されます)を渡します。数字を渡したい場合は、引用符を使用しないでください。

3)「usingnamespace std」を使用していますが、これは多くの理由で間違っており、非常に多くのWebサイトで何度も説明されているため、理由を検索します。

4)free()割り当てられていないメモリを使用しています(C ++ではとが使用malloc()されているため、これは提案されません)。newdelete

編集:これが本当に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;
}

まだ改善すべき点はたくさんありますが、これは少なくともコンパイルして正常に実行されます。

于 2012-10-01T00:03:30.130 に答える
1

私はあなたの質問に少し混乱していますが、私はあなたが主に何であるかを尋ねると思いますstrdup

渡された文字列をコピーし、新しく作成されたjsutへのポインタを返します。そして、デストラクタでは、これらの割り当てられた文字列がある場合はそれを破棄します。

于 2012-10-01T00:06:12.577 に答える