【问题标题】:Static constructor in c++ and fatal error LNK1120: 1 unresolved externalsC++ 中的静态构造函数和致命错误 LNK1120: 1 unresolved externals
【发布时间】:2012-12-04 15:25:15
【问题描述】:

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

我目前有一个 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 unresolved externals,我完全不知道为什么会这样.我以前在尝试编写自己的析构函数时遇到过这个错误,但我只是通过删除那段代码来解决这个问题。

谢谢你,如果我对我提到的一些事情使用了错误的术语,我们深表歉意。

【问题讨论】:

  • 请编辑您的问题以包含完整的错误消息。

标签: c++ static constructor externals


【解决方案1】:

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

counter Nod::ctr;

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

【讨论】:

  • 他可以在这个例子中,但是他可能已经大大减少了代码以发布一些小的东西来重现错误,这个代码会。
  • @CashCow 是的。但从问题中的描述来看,我的印象更像是“复制并粘贴第一个 google hit”。
【解决方案2】:

我以前也犯过这个错误。然后我读了 Scott Meyers 的一篇文章。他建议使用静态函数,而不是类静态变量。这意味着您可以在一个地方声明和定义一个变量。以下打印:

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

【讨论】:

  • 谢谢,这就是我正在寻找的解决方案。非常感谢:D
【解决方案3】:

问题是Nod::ctr 只是声明而不是定义

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

    ...
};

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

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

【讨论】:

    【解决方案4】:

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

    你把一个简单的问题复杂化了,用吧

    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 种构造函数,则在每个构造函数中添加计数器增量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2013-09-26
      • 2011-02-09
      • 2011-11-16
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多