类中静态变量未定义导致undefined reference to static class member问题的解决方法

undefined reference to ***这个链接错误的花样总是层出不穷( more ),这一次是找不到类中的成员。

例子1:undefined reference to VS. 类静态成员变量

在文件A.h中声明了类A与类B:
class A

{

friend class B;

static int pa;                  // 注:这里把成员变量声明为static

}

class B

{
     public:
         void funB(); //funB()用到 A::pa;
}


问题:
gcc返回链接错误:undefined reference to 'A::pa'。然而,把类B中的pa声明为非static变量,则可以通过编译。

WHY:
先复习一下static data members in class。
[1] a  single  piece of storage for a static data member,  regardless of how many objects  of that class you create.
[2] the static data belongs to the class. Its name is scoped inside the class and all objects share that data member.
[3] NOTE : The linker will report an error  if a static data member is declared but not defined .

所以,问题就出在:在class中,无法对static data member进行复制,即便是在构造函数中对static data member进行赋值,linker还是会报错。
因为static data member不属于任何一个对象,所以即便是在创建对象的时候进行赋值,也只能说明,这个对象对这个data member重新赋值而已。
因此,这里的undefined reference to ***,是找不到类静态成员变量的定义。

解决方法:
The definition must occur outside the class (no inlining is allowed), and only one definition is allowed.
It is common to put it in the implementation file for the class.
其实,也就是在 全局 的地方对静态成员变量赋值。

在上面的例子中,可在文件A.cpp中在其他函数定义之外,包括在构造函数之外,加上pa的定义,此时不需要加static前缀,但要加类名限定,也可以不赋值。

A* B::pa;


### 回答1: "undefined reference to" 是一个编译错误,通常是由于缺少库文件或函数定义引起的。解决方法包括: 1. 确保库文件已经正确安装并且在编译时已经链接到程序中。 2. 检查函数定义是否正确,包括函数名、参数和返回类型等。 3. 如果使用了第三方库,确保已经正确包含头文件并链接库文件。 4. 如果使用了多个源文件,确保所有源文件都已经正确编译并链接到程序中。 5. 如果使用了模板或者宏定义,确保它们已经正确展开并且没有语法错误。 6. 如果使用了静态变量或者全局变量,确保它们已经正确定义并且没有重复定义。 总之,解决 "undefined reference to" 错误需要仔细检查代码和编译选项,找出问题所在并进行修复。 ### 回答2: undefined reference to(未定义的引用)是C++程序编译时最常见的错误之一。这种错误通常会出现在缺少头文件或者库文件的情况下。 解决undefined reference to错误的方法主要有以下几种: 1.头文件或者库文件没有包含。在编写程序代码时,使用到的函数、变量等需要在程序中被声明,否则编译器将会无法识别这些内容。因此,在写代码时,需要引入相应的头文件或者库文件。 2.库不匹配。当使用库文件时,需要检查库文件是否与系统环境相匹配。在Linux系统中,不同的库有不同的命名规则,因此需要确认库文件是否命名正确,是否放在正确的位置。 3.函数定义不完整。当出现未定义的引用时,可能是函数定义不完整导致的。检查代码中函数实现的完整性,确保没有遗漏任何必要元素。 4.变量调用不正确。当调用某个变量时,需要确认变量是否已经被正确的定义。如果没有被定义,就会出现undefined reference to错误。 总之,当出现undefined reference to错误时,尽管看起来比较恼人,但通常只需要检查上述几种错误原因,并对代码进行相应的修正,就能够充分解决问题。 ### 回答3: 当你编译程序时,可能会遇到“未定义引用”的错误,这通常是由于缺少某些库或文件的定义或链接问题引起的。最常见的解决方法是确保你包含了正确的库文件和头文件,以及正确地链接这些文件。以下是一些可能有用的解决方法: 1. 确保源代码文件中包含了你需要使用的所有头文件和库文件,并在编译命令中正确地链接这些文件。 2. 确保库文件被正确地安装和配置。如果你自己编译库文件,要确保编译和安装过程正确无误。 3. 检查你的编译器是否支持你需要使用的库文件。有时候,你的编译器版本或操作系统版本可能不支持某些库文件。 4. 检查是否有任何拼写错误或其他语法错误,并在需要的地方进行更正。 5. 如果你使用的是C++程序,则可能需要加上“extern C”语句来解决链接问题。这个语句可以将C++函数的名称转换为C函数的名称,以允许C++函数可以与C函数互相调用。 6. 最后,如果你不知道如何解决这个问题,可以在网络上搜寻相关的解决方案。许多社区和论坛都有关于处理“未定义引用”的问题的讨论,你可以从中找到有用的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值