我正在尝试实现自己的通用数据结构版本以改善编码。我有一个作业,需要一个双向链表,该链表可以容纳int
和无效指针void * data
。我的结构有两种成员类型,一种用于int
,一种用于void*
。
struct Node {
int data;
void* pntData;
Node* next;
Node* previous;
};
class LL {
private:
Node* head;
Node* tail;
int size;
public:
LL();
void insert_front(int data);
void insert_front(void* data);//overloaded for void pointer data types
void printLL();//removed unrelated methods
};
这是我的Node结构和双向链表类。我已经能够编写处理int
的所有方法。我的困惑在于将空指针作为参数,并将其添加到具有int
值的相同链表中。
我知道void指针是可以指向任何类型数据的指针,但是对于如何将void指针用作参数并将其添加到初始化时所用的相同链表中,我感到困惑这个构造函数:
LL::LL() {
head = nullptr;
tail = nullptr;
size = 0;
}
这里是我的append函数,在这里我有重载的想法,因此,如果参数是指针,则数据将作为void* pntData
添加到我的类变量中。如果参数是int,则数据将作为int
添加到我的类变量中。
void LL::insert_front(int data) {
Node* temp = new Node();
if (head == nullptr) {
head = temp;
temp->previous = nullptr;
temp->next = nullptr;
temp->data = data;
tail = temp;
}
else {
temp->previous = nullptr;
temp->next = head;
temp->data = data;
head->previous = temp;
head = temp;
}
size++;
}
void LL::insert_front(void* data) {
Node* temp = new Node();
if (head == nullptr) {
head = temp;
temp->previous = nullptr;
temp->next = nullptr;
temp->pntData = data;
tail = temp;
}
else {
temp->previous = nullptr;
temp->next = head;
temp->pntData = data;
head->previous = temp;
head = temp;
}
size++;
}
问题可能出在我的printLL()
函数中,可能需要if / else来确定是否需要打印int
或需要打印void* pntData
。
请指出正确的方向。
根据您的注释,您希望printLL()
打印void*
指针指向的对象。
这是不可能的。 void*
指针没有有关其指向的类型的信息,因此您不能取消引用该指针。
如果要执行此操作,则需要在Node
中存储指向处理程序函数的附加指针,printLL()
将为每个Node
调用以打印其void*
。然后,需要在指针类型上创建insert_*
函数模板,以便可以找出要为所提供类型存储的正确函数指针,即:
struct Node {
int data;
void* pntData;
Node* next;
Node* previous;
void(*print)(void*) = nullptr; // Initialize with null pointer to indicate that no `void*` is stored.
};
//...
template<typename T>
void LL::insert_front(T* data) {
Node* temp = new Node();
//...
temp->print = [](void* ptr){
if(ptr != nullptr)
std::cout << *static_cast<T*>(ptr);
else
// What to do if we stored a null pointer for `void*`
};
//...
}
//...
void LL::printLL() {
//...
if(node->print != nullptr)
node->print(node->pntData);
//...
}
我感觉这不是练习打算让您执行的操作,但是正如我在评论中说的那样,这对我来说首先没有意义。