c++中的静态构造函数和致命错误LNK1120:1个未解析的外部
Static constructor in c++ and fatal error LNK1120: 1 unresolved externals
首先,我可能应该让你知道,我绝非程序员,我这样做只是为了完成家庭作业,所以如果可能的话,我需要一个非常详细的解释:)
我现在有一个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;
如果有多个类型的构造函数,请在每个构造函数中添加计数器增量。
相关文章:
- Visual Studio 2010 - C++ 致命错误 LNK1120: 1 个未解析的外部
- 在主循环外部多个文件上定义全局变量
- 如何调用外部程序并在 C/C++ 中获取多个返回值
- 如何包含具有多个 dll/dylib 的外部(共享)库
- 链接在XLNT.TEST项目上失败,具有10个未经介绍的外部链接:
- 2 个未解析的外部符号(C++函数基础知识)
- 在外部功能中具有一个变量初始化或内部功能中的多个初始化是最有效的
- C++ 错误 LNK1120:在静态函数内部调用时有 1 个未解析的外部
- 具有多个定义时,对于外部关键字没有错误
- c++中的静态构造函数和致命错误LNK1120:1个未解析的外部
- Visual Studio 2010 C++ /w Google Protocol Buffers.找不到 60 个外部
- C++未解析的外部符号,在2个虚拟抽象方法上有50%的机会
- 类的第二个实现文件中静态字段的C++外部
- 如何跨多个源文件声明和使用全局外部变量
- 在 QT 中启动外部控制台应用程序的多个实例并捕获输出
- LNK1120:Visual Studio 2012 中 1 个未解析的外部
- 为什么这会给出多个定义错误:外部 int i;国际 i;.
- 编译任何内容时出现奇怪的错误,VS 2010:致命错误LNK1120:1个未解决的外部
- 不明确的引用和命名空间(来自两个外部库的定义冲突)
- 使用多个外部库时如何避免"redefinitions"?