Как получить все «следующие» узлы в связанном списке?Построение строки вызова не работает - PullRequest
0 голосов
/ 20 декабря 2018

Итак, у меня проблема.Моя цель состоит в том, чтобы перебрать тщательно составленный список, который я создал.Я хочу использовать std :: string в качестве аргумента оператора if, как указано ниже.Я знаю, что это не очень хорошая идея, даже больше: я знаю, что это может быть САМЫЙ ГЛАВНЫЙ способ сделать это.Неважно, я хочу знать, можно ли это сделать.Я пытался использовать функцию макроса, но я делаю это неправильно или использование такого макроса невозможно.Помоги мне, пожалуйста.У меня нет идей ...

Подобные макросы, которые я использовал в моем старом проекте, где я передал в качестве параметра имя функции (пользователь вводил имя такой функции, как 'sin' или 'tan') из cmath lib для вычисления интеграла для данной функции, поэтому я подумал, что это будет работать и в этом случае, но, видимо, нет.Он говорит:

условное выражение типа 'std :: string' недопустимо

//structures.h    
struct node
{
    int _value;
    node *pNext;
};


//functions.cpp
#define retarded_at(x) x
#define retarded_stringify(y) retarded_at(y)

//@param pHead pointer to first element of the list
void retDispIter(node *pHead)
{
    std::string at{ "pHead->pNext" };

    while (retarded_at(at))
    {
        at += "->pNext";
        //here send node->_value to std::cout
    }
}

Внутри первого цикла while "at" будетбыть 'pHead-> pNext' указывать на следующий элемент.С 8 элементами в списке последнее время будет выглядеть так:

while(pHead->pNext->pNext->pNext->pNext->pNext->pNext->pNext->pNext)

вернет false, а "at" будет содержать указатель (nullptr) на несуществующий 9-й элемент.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

То, что вы хотите получить, невозможно из-за того, что вы запрашиваете:

  • C ++ не может выполнить «текст», созданный во время выполнения, весь код должен быть доступен во время компиляции, поэтомумогут быть скомпилированы в целевые машины - машинный код,
  • во время выполнения, символы (имена переменных, классов, функций, ...) не используются машинным кодом (символы преобразуются в адреса и регистры исмещения адреса)

Самый простой способ заставить это работать:

//@param pHead pointer to first element of the list
void retDispIter(node *pHead)
{
    node* current_node = pHead;

    while (current_node)
    {
        //here send current_node->_value to std::cout

        current_node = current_node->pNext;
    }
}

Другой способ - создать очень простой класс итератора;

struct node_iterator
{
    node* current;

    node_iterator operator++()
    {
        node* temp = current;
        current    = current->pNext;
        return node_iterator { temp };
    }

    node_iterator& operator++(int)
    {
        current = current->pNext;
        return *this;
    }

    node*    operator->() const { return current; }
    node&    operator*() const { return *current; }
    explicit operator bool() const { return current != nullptr; }

    bool     operator==(const node_iterator& other) const { return current == other.current; }
    bool     operator!=(const node_iterator& other) const { return !(*this == other); }
};

Тогда его можно использовать так:

//@param pHead pointer to first element of the list
void retDispIter(node* pHead)
{
    node_iterator iter { pHead };

    while (iter)
    {
        // usage
        std::cout << iter->_value;
        std::cout << (*iter)._value;

        // get next 
        ++iter;
    }
}
0 голосов
/ 20 декабря 2018

C ++ не похож на matlab или python.Он не будет компилировать строки или строки кода во время выполнения.Поэтому нет, вы не можете использовать строки таким образом.

Проверьте различия, прибегая к помощи «компилятор против интерпретатора».C ++ основан на компиляторе, а python - на интерпретаторе.Пользователям программ, сгенерированных на C ++, не обязательно иметь все инструменты сборки для их запуска.

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