| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11713 人关注过本帖
标题:C++静态成员的编译 error LNK2001: 无法解析的外部符号 "private: static i ...
只看楼主 加入收藏
云飞aini
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-5-27
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:6 
C++静态成员的编译 error LNK2001: 无法解析的外部符号 "private: static int AddressBook::m_s_i
程序代码:
//编的一个简单的通讯录的类 对静态成员的运用编译总是报错
class AddressBook
{
public:
    AddressBook(string aName = "NULL",int aPhonenum = 0);
    ~AddressBook();
    static int getLength();
    static void addLength();
    static void decLength();
    void setName(string aName);
    string getName();
    void setPhonenum(int aPhonenum);
    int getPhonenum();
private:
    string m_strName;
    int    m_iPhonenum;
    static int m_s_ilength;
};
AddressBook::AddressBook(string aName /* = "NULL" */,int aPhonenum /* = 0 */)
{
    m_strName = aName;
    m_iPhonenum = aPhonenum;
}
AddressBook::~AddressBook()
{
    --m_s_ilength;
}
错误是AddressBook.obj : error LNK2001: 无法解析的外部符号 "private: static int AddressBook::m_s_ilength" (?m_s_ilength@AddressBook@@0HA)
求解
搜索更多相关主题的帖子: private 
2011-09-27 20:08
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:5 
类里的叫声名
下面这句叫定义
int AddressBook::m_s_ilength = 0;

迭代的是人,递归的是神。
2011-09-27 20:37
云飞aini
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-5-27
收藏
得分:0 
回复 2楼 lintaoyn
后边那个析构函数有错吗?我删了它就不报错了,不知道为什么
2011-09-27 21:31
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
析构函数做一些扫尾的事,你不写编译器也会替你生成一个,但是你声明之后得有定义。我记得在继承的时候好像有注意的地方,具体记不清了

迭代的是人,递归的是神。
2011-09-27 22:03
城东古桥
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:31
专家分:101
注 册:2010-9-13
收藏
得分:5 
回复 3楼 云飞aini
因为你在拆构函数中调用了静态变量m_s_ilength,所以m_s_ilength必须初始化。

[ 本帖最后由 城东古桥 于 2011-10-1 22:45 编辑 ]

来此寻求
2011-09-27 23:07
SeekProDream
Rank: 1
等 级:新手上路
帖 子:1
专家分:5
注 册:2011-9-25
收藏
得分:5 
类中的static类型变量必须要类定义的头文件对应的.cpp文件中定义, int AddressBook:: m_s_ilength = 0(这里按照你要求的值来赋)。因为你的析构函数中用到这个变量,所以在链接时会发现这个符号无法解析。如果你删了析构函数,整个过程中这个static无定义的变量没被用到,所以没报错。
还有4楼说的析构函数在有继承时重要的地方,也就是一定要把析构函数设为virtual,这个只要在最基层的类中设就行,后面自动地动态绑定。因为在有继承时,每个类的析构函数只负责删除该类独有的部分,它继承的部分无法靠它来删除,而且对象在析构过程中类型会变化,正好利用多态性来一层一层来删除,最后整个对象所有部分全部析构。
比如:A继承B,B继承C,C继承D, 对于A类型的对象a,运行析构函数时,由于多态,执行的是A的析构函数,A的部分析构完时对象类型变成B,继续析构时由于多态会执行B的析构函数,同理,最后会执行D的析构函数,直到结束,整个a对象全部析构。
这些只是个人的一点理解。
2011-09-28 04:33
lqsh
Rank: 2
来 自:山东济南
等 级:论坛游民
帖 子:26
专家分:58
注 册:2011-8-29
收藏
得分:5 
程序代码:
int n=0;
int m=0;
class AddressBook
{
public:
    AddressBook(string aName = "NULL",int aPhonenum = 0);
    ~AddressBook();
    static int getLength();
    static void addLength(AddressBook &a);
    static void decLength();
    void setName(string aName);
    string getName();
    void setPhonenum(int aPhonenum);
    int getPhonenum();
private:
    string m_strName;
    int    m_iPhonenum;
    static int m_s_ilength;
};

void AddressBook::addLength(AddressBook &a)
{
    m_s_ilength++;
    a.m_iPhonenum++;

}

int AddressBook::getLength()
{
    cout<<&m_s_ilength<<endl;
    return m_s_ilength;

}

int AddressBook::m_s_ilength=0;
AddressBook::AddressBook(string aName /* = "NULL" */,int aPhonenum /* = 0 */)
{
    m_strName = aName;
    m_iPhonenum = aPhonenum;
}
AddressBook::~AddressBook()
{
    --m_s_ilength;
}

int main()
{
    AddressBook a;
    a.addLength(a);
    cout<<&n<<"  "<<&m<<endl;

    cout<<AddressBook::getLength()<<endl;

    return 0;
}
静态成员分析:
静态类成员包括静态成员函数和静态成员数据,静态数据成员属于类域内的全局变量,属于整个类共有,不属于特定的对象,必要在类外进行初始化。
静态成员一样服从访问权限,私有有静态成员只能在类内部访问,公有或者保护能在类外通过类名或对象名访问,
静态成员函数可以直接引用类名静态成员,但不能直接引用非静态成员。
验证类域内的全局变量 ,全局变量存在堆中,数据按声明顺序递增存储
    &n 地址为0X0108C1A0(H)
    &m地址为0X0108C1A4(H)
    &m_s_ilength地址为0X0108C1A8(H)
2011-09-29 20:48
快速回复:C++静态成员的编译 error LNK2001: 无法解析的外部符号 "private: sta ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017690 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved