2016-03-21 7 views
0

私は今、抽象データ型でこの問題を抱えています。基本的にはC++の文字列クラスのようになっているので、私のADTの数字で混乱しないでください。 動的に割り当てられたオブジェクトを作成する際に問題が発生しています。 (私は、以下のコードで正しく実装されていると信じています)String346オブジェクトへの参照を持つconcat関数を呼び出す必要があります。参照で動的に割り当てられたオブジェクトを返す/渡す

また、このコードでは参照を返すことになっています。誰かがこの概念を私に説明することができれば、これがどのように使用されるのか、それをどのように返すのか、私は多くの機能でString346への参照を返すので、私に知らせてください。ここで

は、オーバーロード/デフォルトコンストラクタは、(データがchar *sizeであることはunsigned intである)である:ここでは

String346::String346(const char * oldString = "") : size(strlen(oldString)) { 
     strcpy(data, oldString); 
    } 

は、渡されるString346オブジェクトのための私のconcat機能のための私のコードは(持っていないですどのように私がこれをやりたいかについて私が計画していないので書いたもの):

String346 & String346::concat(const String346 & catString){ 

    } 

ここで私は混乱しています。これはcharポインタを使用している私のconcat関数です。現在のセグメントconcat(&newCatString);は間違っていると上記の関数では動作しません。:

String346 & String346::concat(const char * catString){ 
    String346 * newCatString = new (std::nothrow) String346(catString); 
    concat(&newCatString); 
} 

は、あなたが何かを必要とするなら、私に教えてください。私はこれがあなたが必要とするものだと信じています。もっと知る必要はありません。

+0

'連結(&newCatString);'ポインタヴァリアーのアドレスを渡しble。 –

+0

'&'を追加しないと、この引数を受け入れる関数がないというエラーが表示されます。 – DrakeJacks

+2

あなたの問題を示すために[MCVE]を投稿してください。 –

答えて

1

あなたは間違った方法を考えています。新しいオブジェクトを動的に割り当てることはありません。割り当てられている/連結されているオブジェクトのデータを動的に(再)割り当ててから、新しい割り当てられたオブジェクトへの参照ではなく、そのオブジェクトへの参照を返します。

あなたは本当に(代わりに標準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; 
} 
関連する問題