Учитывая, что QString
s являются неявно разделяемыми классами значений (а также поддерживают семантику переноса с Qt 4.8), и что мы используем C++, а не C, а год - 2016 год, последнее, что вам нужно сделать, это возиться с указателями на строки, вроде 1980-х годов.
Вот то, что вы хотите:
QVector<QString> strings(1000); // 1000 empty strings
strings[0] = "Foo";
strings[1] = "Bar";
strings.push_back("Moo");
Q_ASSERT(strings.back() == "Moo");
Это также верно, если вы используете std::string
:
QVector<std::string> strings(1000);
// etc.
Если массив имеет фиксированный размер, вы должны использовать std::array
вместо:
std::array<QString, 1000> strings;
strings[0] = "Foo";
strings[1] = "Bar";
Отметьте, что ни один из t он выше код будет медленнее, чем так, как Вы, вероятно, собираетесь это сделать:
QString *strings[1000];
strings[0] = new QString("Foo");
strings[1] = new QString("Bar");
Но это еще не все, конечно. Вы должны убедиться, что строки не просачиваются и, предположительно, что любые нераспределенные строки не являются просто оборванными указателями. И, конечно, вы не хотите, чтобы кто пытается скопировать этот массив вслепую:
// DO NOT EVEN THINK OF DOING IT THIS WAY!
class MyClass {
Q_DISABLE_COPY(MyClass)
QString *strings[1000];
public:
MyClass() { memset(&strings, 0, sizeof(strings)); }
// Note: calling delete with a null pointer is perfectly safe
~MyClass() { for (auto string : strings) delete string; }
void setString(int index, const QString & value) {
if (!strings[index])
strings[index] = new QString(value);
else
*strings[index] = value;
}
QString string(int index) const {
return strings[index] ? *strings[index] : QString();
}
};
Это способ сделать это ужасно абсолютно неуместно в 2016 году Если ваша платформа слишком стара, чтобы использовать std::array
, использовать QVarLengthArray
: это как std::array
, который может произвольно динамически изменять размер. И сохраните эти строки по значению, а не указателем!.
Управление жизненным циклом на месте, которое вы делаете, вызывая деструктор и т. Д., Мучительно и имеет абсолютно никакого места вне специализированных классов, которые занимаются управлением ресурсами. Что это означает в простых английских терминах? Это означает, что , если у есть результаты бенчмаркинга, которые показывают, что нормальные контейнеры как-то слишком медленны. и вы определили, что ваши алгоритмы не виноваты, а просто нужен специализированный контейнер для поддержки указанных специализированных алгоритмов , тогда вы должны напишите пользовательский контейнер, который управляет набором строк. И затем используйте этот контейнер в своем коде, с отвращением. В 99,9999% случаев вы не захотите внедрять такой контейнер. Стандартная библиотека и Qt-контейнеры достаточно умны. Используйте их надлежащим образом, и вы должны быть настроены.
Указатель 'QString *' указывает на массив 'QString', а не массив' QString * '. 'qspointer [index]' является 'QString'. Почему бы вам просто не использовать QStringList или подобное? –
Тот факт, что 'qspointers [index]. ~ QString();' compiles только доказывает, что 'qspointers [index]' является 'QString'. Если бы это был указатель, он не смог бы скомпилировать - вам понадобится qspointers [index] -> ~ QString(); ' –
ph, bloddy foo. :) Спасибо! Лес ... деревья .... – fyngyrz