2012-12-04 77 views
1

首先,我应该让你知道,我绝不是程序员,我只是做这个作业,所以如果有可能我将需要一个非常详细的解释:)C++中的静态构造函数和致命错误LNK1120:1个未解析的外部函数

我目前有一个节点类,我用它来存储点的坐标。除此之外,我想要做的是为每个不同的节点对象分配一个基于计数器的索引号。从我从互联网上收集到的方式,我这样做的方式是使用另一个类,它在构造函数中初始化我的计数器,并且在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() {} 
}; 

现在,建立好了,但只要我尝试宣告我的主函数中点头对象我得到以下错误:致命错误LNK1120: 1个未解决的外部问题,我完全不知道为什么会这样。我以前在尝试编写自己的析构函数时遇到了这个错误,但我通过删除那些代码来解决这个问题。

谢谢你,对不起,如果我对我提到的一些事情使用了错误的术语。

+2

请编辑您的问题,包括完整的错误消息。 –

回答

0

问题是Nod::ctr只是宣称为而不是定义为

class Nod 
{ 
    // Declare the counter variable 
    static counter ctr; 

    ... 
}; 

// Define the counter variable 
counter Nod::ctr; 

定义当然应在源文件,而不是一个头文件,或者你会得到多个定义错误来代替。

2

静态数据成员声明的是在类,但它必须是恰好一个翻译单元(= cpp文件)中所定义。把下列句子变成一个.cpp文件(最好Nod.cpp):

counter Nod::ctr; 

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

+0

他可以在这个例子中,但他可能已经大大减少了代码,以发布一些小代码重现错误,这个代码会。 – CashCow

+0

@CashCow确实。但从问题描述中,我得到的印象更像是“复制并粘贴第一个谷歌搜索”。 – Angew

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; 

如果有超过1型构造,在每一个构造函数中添加计数器增量。

2

我曾经也犯过这种事。然后我读了斯科特迈耶斯的一篇文章。他推荐了一个静态函数,而不是类静态变量。这意味着你可以在一个地方声明和定义一个变量。下面的打印:

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(); 
} 
+0

谢谢,那是我寻找的解决方案。非常感谢:D – user1876125

相关问题