【编译无误,连接错误】类定义中不能声明静态成员static linkStack链表?!
话说昨晚写了个Calculator,一直在纠结,为何不能够把存储number和operator的Stack声明为public static,作为一个成员变量的类型:如下面这样
- C/C++ code
#ifndef __MYCAL_H__#define __MYCAL_H__#include "lk_stack.h"//主要实体类class myCal{private: static bool ISsymbol(char ch); static char Precede(char symbol1,char symbol2); static double Cal(double left,char symbol,double right); static void Get2number(double &left,double&right,LinkStack<double>&); static LinkStack<double> numberStack;//编译通过,连接出错 static LinkStack<char> symbolStack;//编译通过,连接出错public: myCal(){}; virtual ~myCal(){}; static void Run();};编译通过,连接时:
1>正在链接...
1>main.obj : error LNK2001: 无法解析的外部符号 "private: static class LinkStack<double> myCal::numberStack" (?numberS@myCal@@0V?$LinkStack@N@@A)
1>D:\DEEDEE\calculator\Debug\calculator.exe : fatal error LNK1120: 1 个无法解析的外部命令
解决的方法是:将numberStack和symbolStack放到Run方法中进行局部定义.(书上的代码)
下面这样:(运行成功)
- C/C++ code
void myCal::Run(){ LinkStack<char> symbolStack; LinkStack<double> numberStack; symbolStack.Push('=');网上查阅了资料,按理说如果定义了两个成员stack的变量,声明为static应该是在c++的静态(全局)区域中,既不是堆区域,也非栈区域中..
1.想问下,如果使用第一种方法(作为成员变量),有没有方法改正使他成为对的?
2.第一种方法在实际中运用的多否?还是说第二种是标准的思路?
请教前辈么啦!~
[解决办法]
静态数据成员必须在类外定义。