#c #struct #pass-by-reference
Вопрос:
Я использую функцию для печати данных из связанного списка, узлы списка имеют 2 переменные, к которым можно получить доступ, данные или индекс. Я хочу добавить параметр в функцию print (), который позволяет пользователю вызывать имя переменных в узле, который они хотят вывести, я слышал о передаче по ссылке, и я почти уверен, что это то, что я хочу сделать, но не нашел никаких ресурсов, которые действительно работают для моего кода.
(просто я хочу передать имя переменной функции).
вот мой код:
struct Node {
int data;
int index;
Node *next;
}
Node *_current;
Node *_next;
Node *_head;
Node *_temp;
Node *_tail;
Node *_last;
// all this is handled correctly
void print(*variable name*) {
Node *n = _head;
while (n->next != nullptr) {
std::cout << n-> *variable name* << std::endl;
n = n->next;
}
}
p.s: имя переменной не обязательно является указателем, а просто (буквально) ссылается на параметр имени переменной, который я хочу добавить.
этот код работает, если я поменяю имя переменной на ‘std::cout << n->данные < n->< (кстати, весь код представлен не только частями, необходимыми для объяснения того, что я хочу изменить)
любая полезная информация будет очень признательна, заранее благодарю вас. 🙂
Ответ №1:
p.s: имя переменной не обязательно является указателем
Но это указатель. Указатель на элемент, в частности:
void print(int Node::*member) {
Node *n = _head;
while (n->next != nullptr) {
std::cout << n->*member << std::endl;
n = n->next;
}
}
Он будет вызван как либо
print(amp;Node::data);
или
print(amp;Node::index);
Комментарии:
1. большое вам спасибо, Сэм, это решило мою проблему именно так, как я хотел!:), Хорошего дня.
2. Чтобы быть супер техническим, указатели на элементы не являются указателями, несмотря на то, как они называются 🙂
Ответ №2:
Вы можете передать его в виде строки.
void print(const stringamp; str) {
Node *n = _head;
if(str.compare("index")==0){
while (n->next != nullptr) {
std::cout << n->index << std::endl;
n = n->next;
}
}
else if(str.compare("data")==0){
while (n->next != nullptr) {
std::cout << n->data << std::endl;
n = n->next;
}
}
}
Комментарии:
1. Хотя это верно, вы также можете передать логическое значение или перечисление и избавиться от сравнения строк. Кроме того, немного странно сравнивать строку с помощью сравнения, а не
==
2. это действительно работает,однако я ищу решение, которое работает бесконечно, без необходимости использовать массивный цикл switch/ if, else. хотя спасибо за помощь