2016-03-21 27 views
0

tarafından dinamik olarak tahsis nesneyi geçirilmesi. Temel olarak, C++ 'da normalde string sınıfı gibi olması gerekiyordu, bu yüzden ADT'mdeki sayılarla karıştırılmasın. Dinamik olarak ayrılmış bir nesne oluşturma konusunda sorun yaşıyorum. Sonra bir String346 nesnesine referansı vardır concat fonksiyon çağırmak zorunda (ben inanıyorum Hangi aşağıdaki kodu doğru bir şekilde uygulandığında)./Benim Özet Veri Türü Şu anda bu sorun Referans

Ayrıca, bu kodda ben başvuru döndürmek gerekiyor. Birisi bu cihazların nasıl kullanılacağı konusunda bana bu kavramı açıklayabilir ve bunu doğru şekilde döneceğini nasıl olursa benim fonksiyonları çok String346 başvuru döndürmek çünkü lütfen bana bildirin.

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

benim kod içinde geçirilen bir String346 nesne için benim concat işlevi içindir (yok mu: Burada

(veri bir char * ve size bir unsigned int olduğu) aşırı/varsayılan yapıcı olduğunu Yazılı bir şey yapmadığım için planlama yapmak zorunda olmadığım için):

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

    } 

Burada kafam karışıyor. Bu, char işaretçisini kullanarak concat işlevimdir. mevcut segment concat(&newCatString); yanlış ve yukarıdaki fonksiyonu ile çalışmaz .:

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

Başka bir şeye ihtiyacın olursa haber verin. İhtiyacın olan bu olduğuna inanıyorum, daha fazla bilmene gerek yok.

+0

'concat (ve newCatString);' işaretçi variak adresini geçer ble. –

+0

Tamam.Eğer '&' eklemezsem hala bana bu argümanı kabul eden bir işlev olmadığını söyleyen bir hata veriyor. – DrakeJacks

+2

Sorunlarınızı göstermek için bir [MCVE] yükleyin. –

cevap

1

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; 
}