c++中的静态构造函数和致命错误LNK1120:1个未解析的外部

Static constructor in c++ and fatal error LNK1120: 1 unresolved externals

本文关键字:1个 外部 致命错误 静态 构造函数 c++ LNK1120      更新时间:2023-10-16

首先,我可能应该让你知道,我绝非程序员,我这样做只是为了完成家庭作业,所以如果可能的话,我需要一个非常详细的解释:)

我现在有一个Node类,用来存储点的坐标。除此之外,我想用它为每个不同的Node对象分配一个基于计数器的索引号。根据我从互联网上收集的信息,我这样做的方式是使用另一个类,该类在构造函数中初始化我的计数器,在Node类中,我只是将其作为静态参数添加。

这是我上面的代码:

class counter
{
public:
int nr;
counter()
{
nr = 0;
}
};
class Nod   
{  
static counter ctr;
public:   
int index;      
Punct pct;
Nod(Punct &temp)
{  
pct = temp;    
index = ctr.nr ++ ;
}
Nod() {}   
}; 

现在,它构建得很好,但当我试图在我的主函数中声明Nod对象时,我会收到以下错误:致命错误LNK1120:1个未解析的外部,我完全不知道为什么会这样。我以前在尝试编写自己的析构函数时遇到过这个错误,但我只是删除了那部分代码就解决了这个问题。

谢谢,很抱歉,如果我在提到的一些事情上使用了错误的术语。

静态数据成员在类中被声明,但它必须在一个翻译单元(=.cpp文件)中被定义。将以下内容放入一个.cpp文件中(最好是Nod.cpp):

counter Nod::ctr;

顺便说一句,您可以只使用int而不是自定义类counter

我以前也会遇到这种情况。然后我读了斯科特·迈耶斯的一篇文章。他建议使用函数静态变量,而不是类静态变量。这意味着您可以在一个地方声明和定义一个变量。以下打印:

0 1 2 3 4 5 6 7 8 9

#include <iostream>
int next_index(void)
{
static int index = 0;
return index++;
}
int main(void)
{
for (int i = 0; i < 10; ++i) {
std::cout << next_index() << ' ';
}
}

在你的情况下,你会放以下内容:

Nod(Punct &temp)
{  
pct = temp;    
index = next_index();
}

问题是Nod::ctr只被声明,而没有定义

class Nod
{
// Declare the counter variable
static counter ctr;
...
};
// Define the counter variable
counter Nod::ctr;

定义当然应该在源文件中,而不是头文件中,否则会出现多个定义错误。

从问题的描述来看,解决方案要简单得多。

你有一个复杂的简单问题,只需使用

class Nod   
{  
static int ctr;
public: 
int index;      
Nod()
{  
ctr++;  //Increment the counter every time a object is created
}
Nod() {}   
}; 

//Allocate memory also
int Nod::ctr;

如果有多个类型的构造函数,请在每个构造函数中添加计数器增量。