gpt4 book ai didi

c++ - 通过引用返回/传递动态分配的对象

转载 作者:行者123 更新时间:2023-11-28 05:46:14 25 4
gpt4 key购买 nike

我现在在我的抽象数据类型中遇到了这个问题。基本上它应该像通常在 C++ 中的字符串类,所以不要被我的 ADT 中的数字弄糊涂了。我在创建动态分配的对象时遇到问题。 (我相信在下面的代码中正确实现了)然后我需要调用具有对 String346 对象的引用的 concat 函数。

同样在这段代码中,我应该返回一个引用。如果有人可以向我解释这个概念,说明如何使用它以及我将如何以正确的方式返回它,请告诉我,因为我在我的许多函数中返回了对 String346 的引用。

这是重载/默认构造函数(数据是 char *sizeunsigned int):

String346::String346(const char * oldString = "") : size(strlen(oldString)) {
strcpy(data, oldString);
}

这是我的 concat 函数的代码,用于传递一个 String346 对象(没有写任何东西,因为我还没有计划如何我想这样做):

String346 & String346::concat(const String346 & catString){

}

这是我感到困惑的地方。这是我使用 char 指针的 concat 函数。当前段 concat(&newCatString); 是错误的,不适用于上述功能。:

    String346 & String346::concat(const char * catString){
String346 * newCatString = new (std::nothrow) String346(catString);
concat(&newCatString);
}

如果您还需要什么,请告诉我。我相信这就是您所需要的,您不需要了解更多。

最佳答案

你的想法是错误的。您不会动态分配新对象。您动态(重新)分配被分配/连接到的对象的数据,然后返回对该对象的引用,而不是对新分配对象的引用。

如果你真的想在一个类似字符串的类中手动实现它(而不是使用标准的 std::string 类),那么尝试更像这样的东西:

class String346 {
private:
char *data;
unsigned int size;

public:
String346();
String346(const char *oldString);
String346(const String346 &oldString);
~String346();

//...

String346& operator=(const String346 &newString);

//...

String346& concat(const String346 &catString);

//...
};

String346::String346() : data(NULL), size(0) {
}

String346::String346(const char * oldString) : data(NULL), size(std::strlen(oldString)) {
data = new char[size+1];
std::copy_n(oldString, size, data);
data[size] = 0;
}

String346::String346(const String346 &oldString) : data(NULL), size(oldString.size) {
data = new char[size+1];
std::copy_n(oldString.data, size, data);
data[size] = 0;
}

String346::~String346() {
delete[] data;
}

String346& operator=(const String346 &newString) {
String346 tmp(newString);
std::swap(data, tmp.data);
size = tmp.size;
return *this;
}

String346 & String346::concat(const String346 &catString) {
String346 tmp;
tmp.size = size + catString.size;
tmp.data = new char[tmp.size+1];
std::copy_n(data, size, tmp.data);
std::copy_n(catString.data, catString.size, tmp.data+size);
tmp.data[tmp.size] = 0;
std::swap(data, tmp.data);
size = tmp.size;
return *this;
}

从技术上讲,您不必实现 operator=()concat()char* 版本,因为它们都采用const String346& 作为输入,String346 有一个接受 char* 作为输入的构造函数。如果您将 char* 传递给其中之一,编译器将自动为您构造和销毁一个临时的 String346 对象:

String346 s;
s = "hello"; // calls s.operator=(String346("hello"))...
s.concat("world"); // calls s.concat(String346("world"))...

不过,出于优化目的,这样做可能是有意义的,以避免不必要的临时内存分配(除非您在 C++11 中实现移动语义):

class String346 {
private:
char *data;
unsigned int size;

public:
String346();
String346(const char *oldString);
String346(const String346 &oldString);
~String346();

//...

String346& operator=(const char *newString);
String346& operator=(const String346 &newString);

//...

String346& concat(const char *catString);
String346& concat(const String346 &catString);

//...
};

String346::String346() : data(NULL), size(0) {
}

String346::String346(const char * oldString) : data(NULL), size(std::strlen(oldString)) {
data = new char[size+1];
std::copy_n(oldString, size, data);
data[size] = 0;
}

String346::String346(const String346 &oldString) : data(NULL), size(oldString.size) {
data = new char[size+1];
std::copy_n(oldString.data, size, data);
data[size] = 0;
}

String346::~String346() {
delete[] data;
}

String346& operator=(const char *newString) {
String346 tmp(newString);
std::swap(data, tmp.data);
size = tmp.size;
return *this;
}

String346& operator=(const String346 &newString) {
String346 tmp(newString);
std::swap(data, tmp.data);
size = tmp.size;
return *this;
}

String346 & String346::concat(const char *catString) {
unsigned int catSize = std::strlen(catString);
String tmp;
tmp.size = size + catSize;
tmp.data = new char[tmp.size+1];
std::copy_n(data, size, tmp.data);
std::copy_n(catString, catSize, tmp.data+size);
tmp.data[tmp.size] = 0;
std::swap(data, tmp.data);
size = tmp.size;
return *this;
}

String346 & String346::concat(const String346 & catString) {
String tmp;
tmp.size = size + catString.size;
tmp.data = new char[tmp.size+1];
std::copy_n(data, size, tmp.data);
std::copy_n(catString.data, catString.size, tmp.data+size);
tmp.data[tmp.size] = 0;
std::swap(data, tmp.data);
size = tmp.size;
return *this;
}

关于c++ - 通过引用返回/传递动态分配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143579/

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