c++ - 不复制 char 数组,函数 swap 不能正确编译并且 stringPtr 没有被修改

标签 c++ arrays pointers char strcpy

//在头文件中:类定义:

class myString
{
public:

        myString(void);
        myString(const char *str);

        myString(const myString &); //copy constructor 
        ~myString(void); //destructor

        void swap(myString &from);


private:

        char *stringPtr;
        int stringLen;
};

//在cpp文件中定义成员函数

myString::myString(const char *str)
{
    stringLen = strlen(str);

    stringPtr = new char[stringLen+1];

    strcpy(stringPtr,str);
    cout << "constructor with parameter called"<<endl;
}

myString::myString(const myString &str)
{

    stringPtr = new char[str.stringLen +1];
    strcpy(stringPtr,str.stringPtr);
    cout << "copyconstructor"<<endl;
}


void myString::swap(myString &from)
{
    myString buffer(from);
    int lengthBuffer = from.stringLen;

    from = new char[stringLen+1];
    from.stringLen = stringLen;
    strcpy(from.stringPtr, stringPtr);


    stringPtr = new char[lengthBuffer+1];
    stringLen = lengthBuffer;
    strcpy(stringPtr,buffer.stringPtr);
}

最佳答案

您不能修改引用。即使用指针替换它,修改指针也不会修改指向的对象。相反,您需要处理引用 - 只需交换字段。

void myString::swap(myString &from)
{
    std::swap( stringLen, from.stringLen );
    std::swap( stringPtr, from.stringPtr );
}

以上是按照 user sbi 的建议使用 std::swap()在评论中。这完全等同于以下内容(仅供说明,不要重新发明 STL):

void myString::swap(myString &from)
    // First remember own length and pointer
    const int myOldLen = stringLen;
    char* myOldPtr = stringPtr;
    // now copy the length and pointer from that other string
    stringLen = from.stringLen;
    stringPtr = from.stringPtr;
    // copy remembered length and pointer to that other string
    from.StringLen = myOldLen;
    from.StringPtr = myOldPtr;
    // done swapping
}

即使调用自交换,两者也能正常工作:

myString string;
string.swap( string );

关于c++ - 不复制 char 数组,函数 swap 不能正确编译并且 stringPtr 没有被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1605312/

相关文章:

c++ - 遍历两个 vector ,删除 1 的元素

c++ - 为什么我总是必须除以 49 才能得到二进制转换器 + cout 歧义的正确答案?

c++ - 关于使用 QThreadStorage 的线程安全

php - 使用 array_filter 或 array_walk 从数组中删除项目

javascript - React-native 将渲染数组中的值插入到新数组中

c - 段错误转换成二进制

C - 使用指向指针的指针作为函数中的参数

c++ - 一个叫做时钟的类

c++ - 如何在 C++ 中定义矩阵(数组)列表

image - 德尔福7 :Attach Image to Mouse