Конструктор не работает на класс, наследованный от станд.:: строка

Вы можете использовать синтаксис, введенный jss-plugin-global

  '@global': {
    body: {...}
  }

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

5
задан Nik Reiman 20 February 2009 в 19:11
поделиться

6 ответов

Необходимо определить некоторых конструкторов для различных типов, которые Вы хотите смочь преобразовать в Ваши строки. Эти конструкторы могут в основном просто вручить параметры до базового std::string.

Если Вы вручную не создаете их, компилятор создает значение по умолчанию - и конструктор копии для Вас:

MyString() : std::string() { }
MyString(const MyString &other) : std::string(other) { }

Для разрешения конструкции от строковых литералов Вам нужен конструктор, который берет a const char*:

MyString(const char* other) : std::string(other) { }

Конструктор, который берет a const std::string& также было бы полезно для преобразования std::strings к Вашему строковому типу. Если Вы хотите избежать неявных преобразований нормальных строк, необходимо сделать его explicit:

explicit MyString(const std::string &other) : std::string(other) { }

(Отредактированный, потому что моя исходная версия была полна ошибок и я не могу удалить принятый ответ),

6
ответ дан 18 December 2019 в 05:13
поделиться

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

class MyString : public std::string {
   public:    
      MyString() {}
      MyString( const char* c ) : std::string( c )  {}
};

Все три из Ваших тестов должны работать затем.

3
ответ дан 18 December 2019 в 05:13
поделиться

Нижняя строка - то, что Вы не должны делать этого. Деструктор на std::string не является виртуальным. Это означает это, если Вы делаете следующее:

std::vector<std::string*> s_vector;
s_vector.push_back(new MyString("Hello"));
s_vector.push_back(new std::string("World"));

const std::vector<std::string*>::iterator s_vector_end = s_vector.end();
std::vector<std::string*>::iterator s = s_vector.begin();
for (; s != s_vector_end; ++s)
{
    delete *s; // Error, MyString's destructor will
               // not be called, but std::string's!
}

Единственным путем это могло бы быть безопасно, то, если Вы не добавляете участников к своей строке. Вы могли бы думать, что Вам не нужен никто теперь, но кто-то, кто не знает, они выходят, может прийти позже (или Вы, когда Вы забыли этот совет, возможно), и добавьте один, и затем эй престо, у Вас есть трудное для разыскивания утечки памяти.

4
ответ дан 18 December 2019 в 05:13
поделиться

std::string не разработан для наследования. Это не имеет никаких виртуальных функций (даже деструктор!), таким образом, Вы ничего не можете переопределить. Это также не имеет защищенного интерфейса, таким образом, Вы ничего не получаете от разделения на подклассы этого, Вы не могли добраться путем создания некоторых автономных служебных функций, которые берут std::string.

Следует иметь в виду, что большинство реализаций STL ожидает, что Вы будете использовать std::string с семантикой копии, не ссылочной семантикой, и это излагает доводы для добавления наследованных полей или переопределения еще более слабых функций.

Если Вы действительно хотите что-то как std::string с дополнительными функциями Вы могли рассмотреть использование состава вместо наследования, но это не является большим также. Вы не должны волноваться о std::string деструктор, не позвонившись правильно, но Вы действительно заканчиваете тем, что имели необходимость перенести много методов от std::string то, что Вам нужно, который утомителен. Кроме того, Ваши служебные функции будут только работать с MyString, когда большая часть кода соберется ожидать std::string, таким образом, это не является очень допускающим повторное использование.

Вы - более обеспеченное создание некоторых служебных функций, которые берут std::string. Или, если std::string не обеспечивает то, в чем Вы нуждаетесь, необходимо пойти с некоторой другой строковой реализацией, которая удовлетворяет потребностям. Вот некоторые возможности, которые приходят на ум:

35
ответ дан 18 December 2019 в 05:13
поделиться

станд.:: строка не предназначается, чтобы быть наследованной от. Это не имеет никаких виртуальных методов, таким образом, Вы не можете переопределить ни один из его методов.

Необходимо изучить состав. Или просто создание служебных функций, которые воздействуют на станд.:: строки

3
ответ дан 18 December 2019 в 05:13
поделиться

Вы определяете ctor MyString, который не берет аргументов. Если переопределяют другой ctors, таким образом, нет никакого ctor взятия аргумента строки вообще.

Вам нужно к ctor одного аргумента типа const char *, что-то как

 MyString(const char * s): std::string(s){}

(Не доверяйте синтаксису, ищите его; я не пишу C++ каждый день больше.)

Проверьте раздел в FAQ C++, Облегченный на ctors.

(Ой. Символ константы *, не представляют в виде строки. Сказанный Вас я не писал C++ каждый день.)

1
ответ дан 18 December 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: