Bu konuda yanlış şekilde düşünüyoruz. Yeni bir nesneyi dinamik olarak ayırmazsınız. Atanan/birleştirilen nesnenin verilerini dinamik olarak (yeniden) ayırır ve sonra, yeni ayrılmış bir nesneye yapılan bir başvuru değil, o nesneye bir başvuru döndürürsünüz. Eğer gerçekten (yerine standart std::string
sınıfını kullanarak) bir ipe benzer sınıfta elle uygulamak istiyorsanız
, daha sonra böyle bir şey deneyin:
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;
}
Teknik , bunların her ikisi de girdi olarak const String346&
ve String346
almak beri ya operator=()
veya concat()
bir char*
sürümünü uygulamak gerekmez kabul eden bir kurucu sahiptir giriş olarak bir char*
. Eğer onlardan birine char*
iletirseniz, derleyici otomatik olarak inşa etmek ve sizin için geçici bir String346
nesne yok edecek:
String346 s;
s = "hello"; // calls s.operator=(String346("hello"))...
s.concat("world"); // calls s.concat(String346("world"))...
rağmen, optimizasyon amacıyla, bu gereksiz tahsisleri önlemek için, bunu yapmak için mantıklı olabilir geçici bellek (C++ 11 'de hareket anlambilim uygulamak sürece):
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;
}
'concat (ve newCatString);' işaretçi variak adresini geçer ble. –
Tamam.Eğer '&' eklemezsem hala bana bu argümanı kabul eden bir işlev olmadığını söyleyen bir hata veriyor. – DrakeJacks
Sorunlarınızı göstermek için bir [MCVE] yükleyin. –