2016-03-24 16 views
1

alt dizin işlecini geçersiz kılma C++ dilinde bir dize sınıfı oluşturma üzerinde çalışıyorum. Şu anda, abonenin operatörünü geçersiz kılmaya çalışıyorum, böylece kullanıcılar tek tek karakterleri alabilir ve değiştirebilir.Dize sınıfı

String s1 = "String"; 
s1[0] = 'a'; 

alıyorum hatadır:

#ifndef STRING_HPP 
#define STRING_HPP 

#include "test.hpp" 
#include <cstring> 
#include <iosfwd> 


struct String 
{ 
    // Defines the npos value. 
    static constexpr std::size_t npos = -1; 
    int len; 
    char *str; 
    String() 
    :len(0), str(0){} 

    String(char const * S) 
    :len(strlen(S)), str(new char[len + 1]){ 
    assert(S != 0); 
    strcpy(str, S); 
    } 

    ~String(){ 
    delete[]str; 
    } 

    String (char *S, std::size_t const n) 
    :len(n), str(new char[len + 1]){ 
    assert(S != 0); 
    assert(strlen(S) >= n); 
    strncpy(str, S, n); 
    str += '\0'; 
    } 


    String operator +=(String const &S){ 
    int n = len + S.len; 
    char * p = new char[n+1]; 
    strcpy(p + len, S.str); 
    len = n; 
    str = p; 
    return *this; 
    } 

    char* data() const { 
    return this->str; 
    } 

    bool empty() const { 
    return (this->len == 0); 
    } 

    size_t size()const { 
    size_t temp = len; 
    return temp; 
    } 

    //assignment operator 
    String operator =(String const &s){ 
    String temp(s); 
    swap(temp); 
    return *this; 
    } 

    void swap(String &s){ 
    std::swap(len, s.len); 
    std::swap(str, s.str); 
    } 

    size_t find(const char c){ 
    char * p = strchr(this->str, c); 
    if(p){ 
     return (str - p); 
    }else{ 
     return npos; 
    } 
    } 

    char &operator[](const size_t pos){ 
    assert(pos >= 0); 
    assert(pos < this->size()); 
    return str[pos]; 
//return output; 
    } 

    String substr(int index, int dist){ 
    String output((this->str + index) ,dist); 
    return output; 
    } 
}; 


// Output 
std::ostream& operator<<(std::ostream&, String const&); 
//String operator +=(String const &); 
bool operator <(String const &, String const &); 
bool operator >(String const &, String const &); 
bool operator <=(String const &, String const &); 
bool operator >=(String const &, String const &); 
bool operator ==(String const &, String const &); 

#endif 

simge işlevini çağırır ana bölümüdür

error: passing 'const String' as 'this' argument of 'char& String::operator[](size_t)' discards qualifiers [-fpermissive] 

teşekkürler!

Düzenleme

Güncelleme hata mesajı

+0

Yan Not: ' assert (pos> = 0); 'her zaman için bir tür boy_t boyutu –

+0

için derler Benim için derler (bazı eksik' # include's). Lütfen bir [mcve] sağlayın. – Barry

+0

'Dize operatörü + =' yanlış –

cevap

-1

cevap fonksiyonunun sonunda bir 'const' eklemek adildir çıkıyor doğru olduğu:

char &operator[](const size_t pos)const{ 
    assert(pos >= 0); 
    assert(pos < this->size()); 
    return str[pos]; 
//return output; 
    } 
+0

Hayır, siz * bunu yapmak istemezsiniz. Bu, sözde 'const' dizgesinin gerçekten değişebilir olmasını sağlıyor. Aksine, '' '' 'const' uygulanmış olan sürüm 'char const &' döndüren bir aşırı yüklenme olmalıdır. – o11c

+0

Cevap bu değil. Operatörün [] '' bir 'const' sürümü ve const olmayan bir versiyonunun iki aşırı yüklenmesini yazmanız gerekiyor. SO'yu ve alt klasör operatörünün düzgün şekilde aşırı yüklenmesini açıklayan diğer yerlerde arama yapın. – PaulMcKenzie