Static constructor in c++ and fatal error LNK1120:

2020-04-30 07:21发布

To start with i should probably let you know that i am by no means a programmer, and i'm just doing this for a homework assignment, so if it's possible i will require a really detailed explanation :)

I currently have a Node class which i use to store the coordinates of points. Besides that, what i want to do with it is assign each different Node object an index number based on a counter. From what i gathered off the internet the way i do this is by using another class which initializes my counter in the constructor, and inside the Node class i just add it as a static parameter.

This is my code for the above:

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

Now, that builds ok, but as soon as i try to declare a Nod object inside my main function i get the following error: fatal error LNK1120: 1 unresolved externals and i've got absolutely no clue as to why this is. I've previously gotten this error when trying to write my own destructor but i got around that by just deleting that bit of code.

Thank you, and sorry if i'm using the wrong terminology for some of the things i've referred to.

4条回答
祖国的老花朵
2楼-- · 2020-04-30 07:37

A static data member is declared in a class, but it must be defined in exactly one translation unit (= .cpp file). Put the following into one .cpp file (preferably Nod.cpp):

counter Nod::ctr;

BTW, you could have just used an int instead of a custom class counter.

查看更多
叛逆
3楼-- · 2020-04-30 07:47

The problem is that Nod::ctr is only declared but not defined.

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

    ...
};

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

The definition should of course be in a source file, not a header file, or you will get multiple definition errors instead.

查看更多
欢心
4楼-- · 2020-04-30 07:53

From the description of your problem ,the solution is far simpler.

You have complicated a simple issue, just use

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;

If there are more than 1 type of constructor, add the counter increment in every constructor.

查看更多
别忘想泡老子
5楼-- · 2020-04-30 08:00

I used to fall foul of that too. Then I read an article by Scott Meyers. He recommended a function static, rather than class static variable. This means you declare and define a variable all in one place. The following prints:

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

In your case, you'd put the following:

Nod(Punct &temp)
 {  
     pct = temp;    
     index = next_index();
 }
查看更多
登录 后发表回答