gpt4 book ai didi

c++ - strdup 的替代品

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:45 25 4
gpt4 key购买 nike

我正在为一本书编写一个 C++ 类,其中包含一个名字:

class Book {
private:
char* nm;
..........
............
..........
...........
};

我不允许在此作业中使用 std::string。所以这里我使用 strdup 将参数名称的值复制到构造函数中的 nm 中:

Book::Book(const char *name, int thickness, int weight)
: nm(NULL)
, thck(thickness)
, wght(weight)
{
if (name)
nm = strdup(name);
}

是否有另一种方法可以在不使用 strdup 而使用关键字 new 的情况下获得相同的结果?

最佳答案

严格来说:string 类是 Strings 库的一部分。这更易于使用,本质上是动态的,并且与 C 风格的字符串相比,您在复制/分配时更少担心。

另一种方法是手动复制出来:

class Book {
public:
Book(const char *name, ...) : nm(0), ... {
if (!name) throw "invalid parameter";
nm = new char [ strlen(name) + 1 ];
strcpy(nm, name);
}
~Book() {
delete [] nm;
// ...
}
Book(Book const& o) : nm(0), ... {
if (!name) throw "invalid parameter";
char *p = new char [ strlen(name) + 1 ];
if (p) {
strcpy(p, name);
delete [] nm;
nm = p;
}
}
Book& operator=(Book const& o) {
if (this != &o) {
char *p = new char [ strlen(name) + 1 ];
if (p) {
strcpy(p, name);
delete [] nm;
nm = p;
}
}
return *this;
}
};

这种方法的问题是您必须自己管理内存并自己实现所有三大特殊成员函数(并尽可能确保异常安全)。

关于c++ - strdup 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2444085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com