如何通过函数指针实现堆栈以及如何使用它

时间:2015-07-19 03:11:40

标签: c stack function-pointers

我知道c中的struct只包含成员是变量,但没有任何声明函数。是对的吗?
我们在结构中使用函数指针而不是函数吗?

例如:
+使用c ++作为类的成员

trait GlyphsExt {
    fn x(&self); // define extension method
}

impl GlyphsExt for Glyphs {
    fn x(&self) {
        // implement method here
    }
}

+与C,不能这样做。

class stack{
  int[10] data;
  int top;

public:                 
  void init();          
  bool isEmpty();           
  bool isFull();            
  void push(int ivalue);
  int pop();
}

那么我们用函数指针实现堆栈吗?
请举个例子,如何使用它? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

不,函数成员不能在C结构中声明(仅在C ++中)。惯例是在进行面向对象编程时将结构指针作为函数中的第一个参数传递。此外,C ++确实做同样的事情,“this”指针作为第一个参数传递,它只是隐藏。

struct stack{
  int[10] data;
  int top;
};

void stack_init(struct stack* stack);          
int stack_isEmpty(struct stack* stack);           
int stack_isFull(struct stack* stack);            
void stack_push(struct stack* stack, int ivalue);
int stack_pop(struct stack* stack);

下面这部分可能比你要求的要多,但是如果你希望函数更“动态”,你可以在结构中放置函数指针以使它们“可变”,即模拟虚拟关键字C ++。

struct stack{
    int[10] data;
    int top;
    int (*isEmpty)(struct stack* stack);           
    int (*isFull)(struct stack* stack);            
    void (*push)(struct stack* stack, int ivalue);
    int (*pop)(struct stack* stack);
};

int stack_isEmpty1(struct stack* stack);           
int stack_isFull1(struct stack* stack);            
void stack_push1(struct stack* stack, int ivalue);
int stack_pop1(struct stack* stack);

void stack_init1(struct stack* stack)
{
    stack->isEmpty = &stack_isEmpty1;
    stack->isFull = &stack_isFull1;
    stack->push = &stack_push1;
    stack->pop = &stack_pop1;
    ...
}

int stack_isEmpty2(struct stack* stack);           
int stack_isFull2(struct stack* stack);            
void stack_push2(struct stack* stack, int ivalue);
int stack_pop2(struct stack* stack);

void stack_init2(struct stack* stack)
{
    stack->isEmpty = &stack_isEmpty2;
    stack->isFull = &stack_isFull2;
    stack->push = &stack_push2;
    stack->pop = &stack_pop2;
    ...
}

所以现在如果你有2个堆栈对象,分别用stack_init1和stack_init2初始化,它们每个都会调用自己的函数集。例如:

struct stack* a, b;
stack_init1(a);
stack_init2(b);

/* This will call stack_isEmpty1*/
a->isEmpty(a);

/* This will call stack_isEmpty2*/
b->isEmpty(b);