Как объединить две строки для использования в качестве аргумента в списке инициализации? - PullRequest
0 голосов
/ 23 января 2012

У меня есть класс, который расширяет другой, поэтому список инициализации конструктора выглядит так:

MyDialog() : BaseDialog(BaseWindow::getDisplay(), 425, 300, LOC(dialog_title)) {

LOC(dialog_title) имеет дело с локализацией, она будет заменена литеральной строкой типа "Dialog Title". Проблема в том, что я хотел бы использовать другую строку, созданную с LOC, чтобы результат был примерно таким: Dialog Title - Mode. Это требует объединения трех строк: LOC(dialog_title), " - " и LOC(dialog_mode). Как я могу объединить их в списке инициализации?

Ответы [ 3 ]

3 голосов
/ 23 января 2012

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

LOC(dialog_title) " - " LOC(dialog_mode)

В противном случае ответ зависит от того, ожидает ли базовый класс std::string:

std::string(LOC(dialog_title)) + " - " + LOC(dialog_mode)

или строка в стиле C, которую он собирается скопировать в буфер, которым он управляет:

(std::string(LOC(dialog_title)) + " - " + LOC(dialog_mode)).c_str()

или строка в стиле C, на которую он просто сохраняет указатель, в этом случае лучший вариант - поменять базовый класс на менее злой.

1 голос
/ 23 января 2012

Видимо, для вашего BaseDialog требуется const char *.Если это так, вы можете изменить его, чтобы он принимал const std::string&, или создать эту строку перед вызовом конструктора, передавая его как yourString.c_str().

Преимущество его изменения на const std::string& состоит в том, что вы выигралине нарушать существующий код.

0 голосов
/ 23 января 2012

Не работает ли следующее?

MyDialog() : BaseDialog(BaseWindow::getDisplay(), 425, 300, std::string( LOC(dialog_title) + " - " + LOC(dialog_mode) ) {
...