Назначение переменной с использованием метода класса в конструкторе структуры - PullRequest
0 голосов
/ 04 октября 2019

У меня есть класс с именем hash_t. Класс содержит структуру с именем node_t и соответствующий ему конструктор.

    struct node_t
{   node_t *next;
    string key;
    TYPE data;


    node_t(string _key, TYPE &_data)
    {   next = nullptr;
        data = _data;
        key = _key;
    }
};

Используя метод hash_t, показанный ниже, мы берем ключ, передаем его в mkHash и возвращаем хешированную версию ключа.

uint64_t mkHash(const string &strng)
{   const unsigned char *str = (const unsigned char*)(strng.c_str());
    unsigned char ch;
    uint64_t rslt = 5123;
    while ((ch=*str++) != '\0')
        rslt = rslt * 33 + ch;
    return rslt;
}

По сути, я пытаюсь изменить класс node_t для создания хеша в его конструкторе, чтобы сравнивать значения хешей вместо ключей, так как при этом должно использоваться меньше сравнений. Мой мыслительный процесс состоял в том, чтобы запустить метод mkHash внутри конструктора, чтобы присвоить хэш node_t как таковой:

struct node_t
{   node_t *next;
    string key;
    TYPE data;
    uint64_t hsh;

    node_t(string _key, TYPE &_data)
    {   next = nullptr;
        data = _data;
        key = _key;
        hsh = mkHash(key);
    }
};

И я получаю это от MinGW:

error: cannot call member function 'uint64_t hash_t<TYPE>::mkHash(const string&) [with TYPE = std::__cxx11::basic_string<char>; uint64_t = long long unsigned int; std::__cxx11::string = std::__cxx11::basic_string<char>]' without object

Как мне заставить конструктор node_t принять вызов метода для присваивания? Я не уверен, что идет не так, или как это исправить, и любая помощь очень ценится.

1 Ответ

2 голосов
/ 04 октября 2019

Чувствуя себя невероятно глупо, я решил это. Изменил объявление mkHash на static и фактически использовал правильную область видимости для метода hash_t:

struct node_t
{   node_t *next;
    string key;
    TYPE data;
    uint64_t hsh;

    node_t(string _key, TYPE &_data)
    {   next = nullptr;
        data = _data;
        key = _key;
        hsh = hash_t::mkHash(key);
    }
};

Спасибо за вклад

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...