簡體   English   中英

使用復制構造函數C ++進行深度復制

[英]deep copying using copy constructor c++

我正在嘗試實現自己的CString類。 我在淺復制指針時遇到了一些問題。 這是課程

#include<iostream>
#include<string.h>
using namespace std;

class myCString{
public:
    myCString(){
        m_value = NULL;
    }
    myCString(char* strParam){
        int len = length(strParam);
        m_value = new char[len+1];
        for(int i=0;i<len; i++)
        {
            m_value[i] = strParam[i];
        }
        m_value[len]='\0';

    }
    myCString(const myCString& obj)
    {
        int len = obj.length();
        m_value = new char[len+1];
        for(int i=0;i<len; i++)
        {
            m_value[i] = obj.m_value[i];
        }
        m_value[len]='\0';
    }
        myCString(const myCString *obj)
    {
        int len = obj->length();
        m_value = new char[len+1];
        for(int i=0;i<len; i++)
        {
            m_value[i] = obj->m_value[i];
        }
        m_value[len]='\0';
    }
     const int length() const
    {
        return length(m_value);
    }
    myCString operator=(myCString obj)
    {
        int i=0;
        int length= obj.length();
        m_value = new char[length + 1];
        for(;i<obj.length(); i++)
        {
            m_value[i] = obj.m_value[i];
        }
        m_value[length]='\0';
        return m_value;
    }

    ~myCString()
    {
        delete []m_value;
        m_value = NULL;
    }
    friend ostream& operator<<(ostream& os, const myCString obj);
private:
    const int length(char* strParam)const
    {
        int i=0;
        while(strParam[i]!='\0'){
        i++;
        }
        return i;
    }
    char *m_value;
};
ostream& operator<<(ostream& os, myCString obj)
    {
        os<<obj.m_value;
        return os;
    }

這是main():

#include"myCString.h"
int main()
{
    myCString *ptr = new myCString("Hi! This is myCString\n");
    cout<<*ptr;
    myCString *ptr2 = ptr;
    delete ptr;
    cout<<*ptr2;
    delete ptr2;
    return 0;
}

問題是何時進行淺拷貝? 我知道寫作

myCString *ptr2 = new myCString(ptr); 

將解決問題; 但我想保持main函數完整並在類中進行一些更改。 反正我能做到嗎? 提前致謝。

將您的myCString(char* strParam)簽名更改為

myCString(const char* strParam)

您的請求是在myCString *ptr2 = ptr行中制作對象的深層副本,但是該目標無法通過對象的類編程實現,因為該行僅復制一個指針,並且不涉及該對象的類。 如果要調用復制構造函數,則必須按照建議的方式編寫: myCString *ptr2 = new myCString(ptr) ; 或者您可以寫:

myCString mystr("Hi! This is myCString\n");
cout<<mystr;
myCString mystr2 =mystr;
cout<<mystr;

另一個問題:調用函數ostream& operator<<(ostream& os, myCString obj) ,將復制操作符myCString(const myCString& obj)稱為參數obj。 你應該寫

ostream& operator<<(ostream& os, const myCString& obj)

避免這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM