あなたは間違った方法を考えています。新しいオブジェクトを動的に割り当てることはありません。割り当てられている/連結されているオブジェクトのデータを動的に(再)割り当ててから、新しい割り当てられたオブジェクトへの参照ではなく、そのオブジェクトへの参照を返します。
あなたは本当に(代わりに標準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;
}
operator=()
またはconcat()
のいずれもconst String346&
を入力として受け取り、String346
には受け入れるコンストラクタがあるので、char*
バージョンを実装する必要はありませんa char*
を入力します。あなたがそれらのいずれかにchar*
を渡すと、コンパイラが自動的に構築し、あなたのための一時的なString346
オブジェクトを破壊します:
String346 s;
s = "hello"; // calls s.operator=(String346("hello"))...
s.concat("world"); // calls s.concat(String346("world"))...
ものの、最適化のために、それはの不要な割り当てを避けるために、そうする意味があります一時メモリは、(あなたがC++ 11に移動セマンティクスを実装していない限り):
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;
}
'連結(&newCatString);'ポインタヴァリアーのアドレスを渡しble。 –
'&'を追加しないと、この引数を受け入れる関数がないというエラーが表示されます。 – DrakeJacks
あなたの問題を示すために[MCVE]を投稿してください。 –