0

我一直在学习 C++ 中的课程,我从一本旧的俄罗斯书籍中得到了一些关于书籍类的代码,我尝试修改它并运行它它不起作用可能有助于我理解为什么作者使用这个代码(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

发布的代码有很多很多问题。如此多的事情,几乎每一行都是错误的。

最明显的一个是您试图将一年存储为int *,然后传入一个包含的字符串"12.11.13"。那是行不通的。你对pages;做同样的事情 接受一个int*并传入一个包含int 的字符串。你不能那样做,这不是指针的工作方式。您对指针的大部分使用表明您并不真正了解指针的作用,在您将一些非常难以追踪的错误引入代码*之前,您应该停下来阅读指针。您应该将年份存储为字符串(非常糟糕的主意)或将其存储为unix time中的整数,这是非常标准的。

您应该将其删除using namespace std并替换为#include <string>. 你应该扔掉所有以 开头的行char*,并用它们替换它们std::string并扔掉你的int*行并制作它们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)您使用的指针太多。在这段代码中,您甚至不需要一个指针。正如 meagar 所指出的,您可以替换char*std::string。您不需要指向整数或无符号整数的指针,您可以按原样使用类型。

2) 在调用构造函数时,您传递的是字符串(用引号“”表示)而不是数字。如果要传递数字,请不要使用引号。

3)您使用的是“使用命名空间标准”,这有很多原因是错误的,并且在很多网站上已经解释了很多次,我会让您搜索原因。

4)您正在使用free()尚未分配的内存malloc()(并且在 C++ 中甚至不会建议,因为我们有newand delete)。

编辑:如果这是你从一本关于 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 回答