Dea*_*man 1 c++ pointers void-pointers
我想用C/C++创建一个通用链表(不使用C++模板).我写了以下简单的程序,它现在工作正常 -
typedef struct node
{
void *data;
node *next;
}node;
int main()
{
node *head = new node();
int *intdata = new int();
double *doubledata = new double();
char *str = "a";
*doubledata = 44.55;
*intdata = 10;
head->data = intdata;
node *node2 = new node();
node2->data = doubledata;
head->next = node2;
node *node3 = new node();
node3->data = str;
node3->next = NULL;
node2->next = node3;
node *temp = head;
if(temp != NULL)
{
cout<<*(int *)(temp->data)<<"\t";
temp = temp->next;
}
if(temp != NULL)
{
cout<<*(double *)(temp->data)<<"\t";
temp = temp->next;
}
if(temp != NULL)
{
cout<<*(char *)(temp->data)<<"\t";
temp = temp->next;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 我需要知道我在上面的代码中打印的数据的数据类型.例如 - 第一个节点是int所以我写了 - *(int*)(temp-> data)第二个是double等等......相反,有没有通用的方式简单地显示数据而不用担心数据类型?
我知道你可以通过模板实现这一点,但是如果我必须在C中做到这一点怎么办?
谢谢你,凯达
通用列表的重点是您可以在其中存储任何内容.但是你必须面对现实......你还需要知道什么,你在它的推杆.因此,如果您要在列表中放置混合类型,那么您应该查看使用Variant模式.也就是说,提供多种类型的类型.这是一个简单的变体:
typedef struct Variant
{
enum VariantType
{
t_string,
t_int,
t_double
} type;
union VariantData
{
char* strVal;
int intVal;
double doubleVal;
} data;
} Variant;
Run Code Online (Sandbox Code Playgroud)
然后你可以告诉自己"我在void*列表中存储指向Variants的指针.这就是你在C中的表达方式.我假设当你说"C/C++"时你的意思是你在尝试编写C代码但是使用C++编译器.不要忘记C和C++是两种不同的语言,有一些重叠.尽量不要将它们放在一个单词中,就像它们是一种语言一样.