用C++写了个栈,里面加了静态变量,不知道为什么link的时候总是出错。。

2025年03月01日 06:19
有5个网友回答
网友(1):

你只声明了base,top并没有给出定义,编译器没有找到定义自然会报错。就相当于你只给出了函数的声明而没有给出定义一样,如果你把InitStack()函数的定义去掉,也会出现类似的错误。你只要加两句:
stack_data* stack_data::base = NULL;
stack_data* stack_data::top = NULL;
就好了。

网友(2):

#include
using namespace std;
class stack_data{
public:
static void Initstack();
private:
double value;
stack_data* next;
public:
static stack_data* base;
static stack_data* top;
};
stack_data* stack_data::base = 0;
stack_data* stack_data::top = 0;
void stack_data::Initstack(){
top=base=new stack_data();
}
int main(){
stack_data s;
stack_data::Initstack();
return 0;
}

网友(3):

类的静态成员变量和全局变量一样是在类和函数的外部定义和初始化。
stack_data * stack_data::top=new stack_data;
stack_data * stack_data::base=stack_data::top;

修改后的完整的示例程序:
#include
#include
#include
#include

using namespace std;
class stack_data{
public:
void Initstack(double Val);

//这些成员函数用于访问受保护的数据
void SetNext(stack_data * pVal);
stack_data * GetNext();
double GetValue();

private:
double value;
stack_data * next;

public:
static stack_data* base;
static stack_data* top;
};

stack_data * stack_data::top=new stack_data;stack_data * stack_data::base=stack_data::top;
void stack_data::Initstack(double Val){
//***在这里你可以访问top和base的值,也可以修改****
value = Val;
next = NULL;
}

stack_data * stack_data::GetNext(){
return next;
}

void stack_data::SetNext(stack_data * pVal){
next = pVal;
}

double stack_data::GetValue(){
return value;
}

int main(){
char ch;
double Val = 0.0;
stack_data * ps = NULL, * tempPs = NULL;

//***** 初始化第一个节点的Next指针为空,作为循环弹栈终止条件 ***** stack_data::top->SetNext(NULL);
//***** base指针始终不变 *******
printf("是否要添加节点?如果是请按Y或者y,否则按其他键:\n");
ch = getch();

while(ch == 'y' || ch == 'Y'){ //创建节点
ps = new stack_data;
printf("请输入节点数据:\n"); scanf("%lf",&Val);
ps->Initstack(Val);

tempPs = stack_data::top;

stack_data::top = ps; stack_data::top->SetNext(tempPs);
printf("是否继续添加节点?如果是请按Y或者y,否则按其他键:\n");
ch = getch();
}

//输出出头结点外的所有各节点的数值
for(ps = stack_data::top; ps->GetNext() != NULL; ){
printf("%f\n",ps->GetValue());

tempPs = ps; ps = ps->GetNext();
//释放当前节点
delete tempPs;
}

//只剩下头结点 stack_data::top = stack_data::base;
return 0;}

网友(4):

在类中声明了静态变量并未在类外定义。

网友(5):

貌似是这两静态变量没初始化赋初值?