Вызов класса через функцию - PullRequest
0 голосов
/ 04 июня 2018

я играл с d, можно заставить приведенный ниже код работать без использования, например, auto test1 = new Word ("hello");??

import std.stdio;
import std.conv : to;
import std.digest.sha;
import std.algorithm;





class Word {
    string thisWord;

    this(string fWord) {
        thisWord = fWord;   
    }

    string toHex(){
        return (cast(ubyte[]) thisWord).toHexString;
    }
}


string test(const Word& thisword){
    writeln(thisword.toHex)
}



void main() {

    test("hello");
}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Ответ нет - это невозможно .Что-то, где-то нужно создать экземпляр объекта типа Word и передать его в функцию test (Word).Например, вы можете добавить перегруженную функцию (обертку) test(string), которая принимает строку и вызывает оригинальную функцию test(Word), которая есть в вашем коде.Что-то вроде:

string test(string arg){
    test(new Word(arg);
}
0 голосов
/ 05 июня 2018

Кажется, вы запрашиваете неявное преобразование, как в C ++ .У D есть только несколько из них - есть некоторые неявные преобразования по умолчанию в языке (int в float, non-const в const), и псевдоним this для преобразования типа, которым вы управляете, во что-тоelse.

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

Несколько других вещей в вашем коде: string test(const Word& thisword) - это не D - классы всегда являются ссылочными типами, ипоэтому добавление амперсанда в C ++ не нужно, а также не работает (ссылки в D помечены ref вместо &).

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

...