首先,我应该让你知道我不是一个程序员,而我只是为了完成一项家庭作业,所以如果可能的话,我需要一个非常详细的解释:)
我目前有一个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() {}
};
现在,构建正常,但是一旦我尝试在我的main函数中声明一个Nod对象,我就会收到以下错误:致命错误LNK1120:1个未解析的外部因素,我完全不知道为什么这是。我以前在尝试编写自己的析构函数时遇到了这个错误,但我只是删除了那段代码而解决了这个问题。
谢谢,对不起,如果我使用了错误的术语来表达我提到的一些事情。
答案 0 :(得分:2)
静态数据成员在类中声明 ,但必须在一个转换单元(= .cpp文件)中定义。将以下内容放入一个.cpp文件(最好是Nod.cpp):
counter Nod::ctr;
顺便说一句,您可能刚刚使用了int
而不是自定义类counter
。
答案 1 :(得分:2)
我曾经也因此而犯规。然后我读了Scott Meyers的一篇文章。他推荐了一个函数static,而不是类静态变量。这意味着您可以在一个地方声明和定义变量。以下打印:
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();
}
答案 2 :(得分:0)
问题是Nod::ctr
只是声明而不是已定义。
class Nod
{
// Declare the counter variable
static counter ctr;
...
};
// Define the counter variable
counter Nod::ctr;
定义当然应该是源文件,而不是头文件,否则你会得到多个定义错误。
答案 3 :(得分:0)
从您对问题的描述来看,解决方案要简单得多。
你复杂化了一个简单的问题,只需使用
即可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;
如果有多于一种类型的构造函数,请在每个构造函数中添加计数器增量。