Странная задача присваивания - C ++ - PullRequest
2 голосов
/ 21 сентября 2011

Возникла странная проблема с созданием нового строкового класса и присвоением ему массива char* в компиляторе GCC. Исходный код:

#include "../Include/StdString.h"

StdString::StdString()
{
    //ctor
    internstr = std::string();
}

char* StdString::operator=(StdString other) {
    return other.cstr();
}

StdString StdString::operator+(StdString other) {
    StdString newstr = StdString();
    newstr.internstr = internstr+other.internstr;
    return newstr;
}

void StdString::operator=(char* other) {
    internstr = other;
}

StdString::~StdString()
{
    //dtor
}

char* StdString::cstr() {
    return (char*)internstr.c_str();
}

Ошибка: требуется преобразование из char* в нескалярный тип StdString.

Как std::string выполнял свои задания?

Ответы [ 5 ]

2 голосов
/ 21 сентября 2011

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

class std::string {
  // ...
std::string(const char *);
};

ПРИМЕЧАНИЕ: фактический std :: string более сложный.

С помощью оператора присваивания вы сможете выполнять

StdString str;
str = "hello";

но не

StdString str = "hello";
1 голос
/ 21 сентября 2011

StdString mystr = "Привет, мир!";

требуется конструктор копирования.

Попробуйте добавить следующее:

StdString::StdString(const char* other)
{
    internstr = other;
}
1 голос
/ 21 сентября 2011

Ошибка в том, что вы не предоставили конструктор, который принимает char*.Это функция преобразования, о которой жалуется компилятор за отсутствие.

StdString::StdString(char const* s)
{
    // ...
}

Кроме того, если ваша внутренняя строка - std::string, то вам не нужны никакие операторы присваивания, конструктор копирования и деструктор.Как только вы добавите конструктор преобразования char*, предоставленный компилятором оператор присваивания будет магически работать и для char*.Ну, не совсем волшебно: компилятор увидит, что он может преобразовать char * в StdString через ваш конструктор преобразования, а затем использовать это с оператором неявного присваивания.

Вы также можете оставить значение по умолчаниюопределение конструктора пустое;это даст вам конструкцию по умолчанию для всех участников, что, вероятно, достаточно хорошо.

0 голосов
/ 21 сентября 2011

Почему вы определяете свой оператор преобразования следующим образом:

char* StdString::operator=(StdString other) 
{ 
    return other.cstr(); 
} 

Все это возвращает содержимое other без установки значения internstr текущего класса на значение, данное другим.

То, что я сделал бы, выглядело бы больше как:

StdString& StdString::operator=(StdString other) 
{ 
    //  copy contents of other to this->internstr

    return *this;
} 
0 голосов
/ 21 сентября 2011

Похоже, вы путаете назначение и инициализацию.При инициализации используется конструктор, даже если он вызывается с символом "=".

...