通过引用

时间:2016-03-21 23:31:22

标签: c++ return-by-reference

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

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

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

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

以下是我的concat函数的代码,用于传递String346个对象(不要写任何内容,因为我还没有按照我想要的方式进行规划这样做):

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

    }

这是我感到困惑的地方。这是使用concat指针的char函数。当前细分concat(&newCatString);错误,并且无法使用上述功能。:

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

如果您还有其他需要,请告诉我。我相信这是你需要的,你不应该知道更多。

1 个答案:

答案 0 :(得分:1)

你正在考虑这个错误的方法。您不动态分配新对象。您动态(重新)分配正在分配/连接的对象的数据,然后返回对该对象的引用,而不是对新分配的对象的引用。

如果你真的想在一个类似字符串的类中手动实现它(而不是使用标准的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;
}

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

String346

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

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

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);

    //...
};