глубокое копирование с использованием конструктора копирования Stack Overflow

Я пытаюсь реализовать свой собственный класс 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;
}

и вот основной ():

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

исправит проблему; но я хочу сохранить основную функцию без изменений и внести некоторые изменения в класс.
Могу ли я это сделать?
Заранее спасибо.

0

Решение

Ваша просьба сделать глубокую копию объекта в строке 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)

чтобы избежать этого.

0

Другие решения

Измени свой
myCString(char* strParam) подпись

myCString(const char* strParam)

0

По вопросам рекламы [email protected]