2009-08-22 2 views
4

Я изучаю cpp и в моем последнем задании я переписываю класс std :: string. так вот набросок моего кода: строка класс:C++: ошибка: недопустимые операнды типов 'String *' и 'const char [7]' to binary 'operator +'

class String { 
    public: 
     String(const char* sInput) { 
      string = const_cast<char*> (sInput);     
     } 

     const String operator+(const char* str) { 
      //snip 
      print(); 
     } 

     void print() { 
      cout<<string; 
     } 

     int search(char* str) { 

     } 

    private: 
     char* string; 
     int len; 
}; 

О, и я должен сказать, что я пытался объявить метод как String, оператор * + (Const символ * НТР) и константным Строка & оператора + (const char * str) без изменений. А вот как я запускаю его:

int main(int argc, char* argv[]) { 
    String* testing = new String("Hello, "); //works 
    testing->print();//works 
    /*String* a = */testing+"World!";//Error here. 
return 0; 
} 

Полная ошибка выглядит такой:

foobar.cc:13: error: invalid operands of types ‘String*’ and ‘const char [7]’ to binary ‘operator+’

Я посмотрел на Google и в книге я учусь из без успеха. любой с предложениями? (Я уверен, что я делаю что-то глупое, вам придется простить меня, я изначально программист на PHP). Может ли кто-нибудь указать мне на то, что мне не хватает?

ответ

5

Вы, вероятно, не хотите использовать указатель классу String. Попробуйте этот код:

int main(int argc, char* argv[]) { 
    String testing = String("Hello, "); //works 
    testing.print();//works 
    String a = testing+"World!"; 
    return 0; 
} 

При определении новых операторов для типов C++, вы вообще будете работать с фактическим типом непосредственно, а не указателя на ваш тип. Объекты C++, выделенные, как указано выше (как String testing), выделяются в стеке (до конца «области» или функции) вместо кучи (живет до конца вашей программы).

Если вы действительно хотите использовать указатели на ваш тип, вы бы изменить последнюю строчку так:

String *a = new String(*testing + "World!"); 

Однако, следуя примеру std::string это не так, как вы обычно хотите использовать такой Строковый класс.

+0

Хорошая идея, но теперь, когда я это делаю: String testing = new String («Hello»); Я получаю следующую (такую ​​же) ошибку: foobar.cc:11: ошибка: преобразование из 'String *' в нескалярный тип 'String' запрошен –

+2

Уведомление Я удалил в моем примере ключевое слово "new" из этой строки. Использование «new» выделяет что-то в куче и возвращает указатель на него; без «нового» это вызов конструктора для объекта в стеке. –

+0

О, хорошо, спасибо! –

3

Ваш оператор + определен для String и const* char, а не для String*. Вы должны разыменовать testing, прежде чем добавить, т.е .:

String a = (*testing) + "World"; 

Хотя в данном случае я не вижу смысла в создании тестирования указатель в кулак место.

Edit: Создание строки без указателей будет выглядеть следующим образом:

String testing = "Hello, "; 

или

String testing("Hello, "); 

(обе эквивалентны).

+0

Это сработало :), Но теперь я стараюсь не использовать обозначение указателя при построении и i получить ту же ошибку на строительной линии: foobar.cc:11: ошибка: преобразование из «String *» в нескалярный тип «String» запрошен Должен признать, что эти указатели довольно запутывают начинающего. –