Я пишу trie в D и хочу, чтобы каждый объект trie имел указатель на некоторые данные, у которого есть значение, отличное от NULL, если узел является терминальным узлом в trie, а NULL - в противном случае. Тип данных не определен до тех пор, пока не будет создано trie (в C это будет сделано с void *
, но я планирую сделать это с помощью шаблона), что является одной из причин того, что указатели на объекты кучи желательны.Как создать строку в куче в D?
Это требует от меня, в конечном счете, создания моих данных в куче, и в этот момент на нее может указывать узел trie. Экспериментируя, кажется, что new
выполняет эту задачу, как и в C++. Однако по какой-то причине это терпит неудачу со строками. Следующий код работает:
import std.stdio;
void main() {
string *a;
string b = "hello";
a = &b;
writefln("b = %s, a = %s, *a = %s", b, a, *a);
}
/* OUTPUT:
b = hello, a = 7FFF5C60D8B0, *a = hello
*/
Однако это не удается:
import std.stdio;
void main() {
string *a;
a = new string();
writefln("a = %s, *a = %s", a, *a);
}
/* COMPILER FAILS WITH:
test.d(5): Error: new can only create structs, dynamic arrays or class objects, not string's
*/
Что это дает? Как создать строки в куче?
P.S. Если кто-либо пишет компилятор D, читает это, апостроф в «string» является грамматической ошибкой.
«PS Если кто-нибудь писать D компилятор читает это, апостроф в «строке» является грамматической ошибкой ». Нет, это намеренно. Если бы вы этого хотели, использовала бы необработанную строку. auto mystring = \ 'string's \'; – 0b1100110