C ++: ошибка: недопустимые операнды типов «String *» и «const char [7]» для двоичного «оператора +» - PullRequest
4 голосов
/ 23 августа 2009

Я изучаю cpp и в своем последнем задании я переписываю класс std :: string. так вот схема моего кода: класс строки:

   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 * operator + (const char * str) и как const String & operator + (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: ошибка: недопустимые операнды типов ‘String *’ и ‘const char [7] ’в двоичный‘ оператор + ’

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

Ответы [ 2 ]

5 голосов
/ 23 августа 2009

Возможно, вы не хотите использовать указатель для вашего 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, вы не захотите использовать такой класс строк.

3 голосов
/ 23 августа 2009

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

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

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

Редактировать: создание строки без указателей будет выглядеть так:

String testing = "Hello, ";

или

String testing("Hello, ");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...