2015-02-27 2 views
1

Что мне нужно, чтобы вернуться сюда?Перегрузка [] в подклассе C++ string

char BCheckString::operator[](int index) 
{ 
    if (index < 0 || this->length() <= index) 
    { 
     throw IndexOutOfBounds(); 
     ???Do I need to return something here??? 
    } 
    else 
    { 
     return ?????; 
    } 
} 

Я попытался return this[index], но VS2013 говорит:.. «Не подходит функция преобразования из„BCheckString“не„символ“существует И я понятия не имею, что возвращение после броска

у меня есть:

class BCheckString : public string 
{ 
private: 
    bool checkBounds(); 
public: 
    BCheckString(string initial_string); 
    char operator[](int index); 
    class IndexOutOfBounds{}; 
}; 

и

BCheckString::BCheckString(string initial_string) : string(initial_string) 
{ 
} 

char BCheckString::operator[](int index) 
{ 
    if (index < 0 || this->length() <= index) 
    { 
     //throw IndexOutOfBounds(); 
     cout << "index out of bounds" << endl; 
     return 'A'; 
    } 
    else 
    { 
     return 'A'; 
    } 
} 

Очевидно, что это домашнее задание;)

+3

Почему вы публично выводе из 'станд :: string'? http://stackoverflow.com/questions/6006860/why-should-one-not-derive-from-c-std-string-class – PaulMcKenzie

+1

@PaulMcKenzie бог спаси нас. Учителя рассказывают своим ученикам о том, что они не могут быть извлечены из классов.Вот почему большинство программных продуктов обновлено. –

+0

В любом случае, я вижу, что ответы здесь помогут вам решить вашу проблему. Я предлагаю вам также взять цитату из «Эффективного C++», которая объясняет, почему вы не должны извлекаться из 'std :: string' и показывать ее своему учителю (после того, как вы это поняли). –

ответ

3

Наблюдая то, что вы делаете здесь не нужен, синтаксис таким образом:

return string::operator[](index); 

Вы звоните в operator[] вашего string родителя. Это должно быть предпочтительнее использовать c_str, потому что string::operator[] делает проверку границ в отладочных сборках.

Стоит также отметить, что .at уже проверяет границы в выпусках и выдает std::out_of_range.

Для первого вопроса нет. После исключения исключения вам не нужно иметь оператор return. На самом деле, если вы это сделаете, компилятор может предупредить вас о «недостижимом коде».

+1

На самом деле, правильная реализация (как бы такая глупость никогда не была должным образом реализована) была бы просто '{return string :: at (index); } ' – Walter

1

Если вы получили из std :: string, вы можете просто использовать метод c_str() для доступа к данным.

return this->c_str()[index]; 
3

Во-первых, выводя из std::string не рекомендуется: Why should one not derive from c++ std string class?

Как ваши вопросы:

1) После того, как throw вы ничего не вернуть.

2) Ваша попытка использовать operator[] неверна, так как вы не вызываете родительский класс std::string::operator[].

Для вызова правильно operator[]:

else 
{ 
    return std::string::operator[](index); 
} 
+0

' Я попытался вернуть этот [index] 'Это то, о чем я говорю. – PaulMcKenzie

+0

Да, вы правы. Я обновлю ответ. – PaulMcKenzie

+0

Вы дали действительно хорошее объяснение. – abalter

2

this является указателем, поэтому this[index] будет ошибочно рассматривать this как указание на массив экземпляров, чтобы получить доступ к index -го из них. Это будет экземпляр самого класса, и нет никакого неявного преобразования от него к объявленному типу возврата char (об этом жалуется сообщение об ошибке).

Вы должны получить полукокс из базовой строки, и это делается с

return this->string::operator[](index); 
Смежные вопросы