Hi, I was making a pogram to demostrate static variables and I don't know why my compiler (VS 2005) is giving me these crazy errors that my book im using said I shouldn't be getting. Here is my program, please help:
header:

class number{
private:
	 static int num;
public:
	 int getnum()
	 {return num;}
	void setnum(int innum)
	{num=innum;}
};

body (.cpp)

#include<iostream>
#include"headerr.h"
using namespace std;
int main()
{
	int innum=0;
	class number test;
	test.setnum(10);
	cout<<test.getnum();
system("pause");
return (0);
}

This code returns the errors:
body.obj : error LNK2019: unresolved external symbol "private: static int number::num" (?num@number@@0HA) referenced in function "public: static int __cdecl number::getnum(void)" (?getnum@number@@SAHXZ)
1>C:\Documents and Settings\Computer stuff man\Desktop\test progams\classes 3.0\Debug\classes 3.0.exe : fatal error LNK1120: 1 unresolved externals

Recommended Answers

All 8 Replies

You need to define num as well as declare it:

class number{
private:
	 static int num;
public:
	 int getnum()
	 {return num;}
	void setnum(int innum)
	{num=innum;}
};

int number::num;

Does it matter where you do this (int number::num) because I tried it out in the main and it works now but why? It doesn't seem to do anything other than maybe introduce it into a new block however you put it in the header and it still works. So what does it really do ?

Does it matter where you do this (int number::num) because I tried it out in the main and it works now but why? It doesn't seem to do anything other than maybe introduce it into a new block however you put it in the header and it still works. So what does it really do ?

It doesn't matter where you do it, as long as you obey the one-definition rule (ODR). Typical projects link together object multiple object files to create an executable, and each object file is created from a single source file. If you have two or more source files in your project, then only one of them can define number::num.

Placing the definition in your header file will violate the ODR if more than one source file in your project #include's it.

My real question now is why do I need the syntax number::num; - what does it do physically in the program.

My real question now is why do I need the syntax number::num; - what does it do physically in the program.

Narue answered that already.

The "static int num;" within the body of class number declares the static member. The statement outside the class body "int number::num;" defines it.

Declaring a static member of a class means that it is known to exist, so code can reference it. Defining a static means allocating storage for it so, when a program is linked, all references in code to that static member resolve to the same object (i.e. the same area of physical memory).

So, just to check, int number::num; clears a place to store data at a certain data location-just like when you declare a class variable you give all of the variables in the class a place in physical memory and an adress however the adress holds NULL.

Line 2 of your second code snippet : #include"headerr.h"
Two rr's?

So, just to check, int number::num; clears a place to store data at a certain data location-just like when you declare a class variable you give all of the variables in the class a place in physical memory and an adress however the adress holds NULL.

Sorry, that statement strikes me as gibberish.

The declaration "static int num;" within the body of class number simply tells the compiler that a single integer named number::num exists somewhere in memory.

The definition "int number::num;" ensures that memory is actually allocated to hold (or represent) that single integer.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.