Initializing static variables in static function result in unresolved - c++

class PossibilisticShellClustering
{
public:
PossibilisticShellClustering(void);
~PossibilisticShellClustering(void);
static void SetParameters(double deltaDistance);
static double deltaDistance
};
and i wanto to initialize static variable deltaDistance in function SetParameters. So in *.cpp file I wrote
void PossibilisticShellClustering::SetParameters(double deltaDistance)
{
PossibilisticShellClustering::deltaDistance = deltaDistance;
}
however I get linker erros
unresolved external symbol "public:
static double
PossibilisticShellClustering::deltaDistance"
(?deltaDistance#PossibilisticShellClustering##2NA)
Could somebody tell me why ?
PossibilisticShellClustering.obj

You need to defined PossibilisticShellClustering::deltaDistance in a source file somewhere in your program, usually a .cc or .cpp file.
double PossibilisticShellClustering::deltaDistance;
What you have in the class body (or would have if it was terminated with a ;) is only a declaration. Static data members also need a definition.

Related

Why does declaring a struct inside another header file cause a LNK2001 error? [duplicate]

This question already has answers here:
static variable link error [duplicate]
(2 answers)
Closed 2 years ago.
I'm trying to make a text-based console video game in c++.
I have an Inventory class with a header and a source file. In the same header file I have declared a struct called STRINGSIZES with two integer members called name and description. They are used to store the length that should be used when displaying the Items, or from which length the name will be shortened. The header file "Inventory.h" looks something like this:
#pragma once
#include <iostream>
struct STRINGSIZES { //the fixed Size with which Inventory lists will be printed
int name;
int description;
};
class Inventory
{
public:
//some unrelated code
Inventory();
static void setStringSizes(int name, int description);
private:
static STRINGSIZES stringSizes;
};
In the Inventory.cpp file, I define the setStringSizes() method like so:
void Inventory::setStringSizes(int name, int description)
{
stringSizes.name = name;
stringSizes.description = description;
}
In my main Source.cpp file, I am firstly calling this method.
Now when I try to compile this I get the errors:
1>Inventory.obj : error LNK2001: unresolved external symbol "public: static int stringSizeNames::name" (?name#stringSizeNames##2HA)
1>Inventory.obj : error LNK2001: unresolved external symbol "public: static int stringSizeNames::description" (?description#stringSizeNames##2HA)
What is the problem here?
The error message refers to a variable which declaration you did not show in the question. But I think it is the same problem as with the static data member stringSizes.
Within the class definition this data member
static STRINGSIZES stringSizes;
is a declaration that is not a definition.
You have to define it outside the class definition in the cpp file for example like
STRINGSIZES Inventory::stringSizes;
If your compiler supports the C++17 Standard then you could define the data member inside the class definition the following way
class Inventory
{
//...
inline static STRINGSIZES stringSizes = {};
};

unresolved external symbol in class

I have been trying for hours to get rid of my errors but it won't go away, i have looked up other posts but nothing seems to work.
I got my .H file with something like this:
using namespace std;
class common
{
public:
common();
static double common::s_a;
static double common::s_b;
Then i got a .CPP file where i've defined those variables like this:
#include "common.h"
common::common()
{
common::s_a = 100;
common::s_b = 100;
}
Then i got this error message(actual variable name instead of a)
common.obj : error LNK2001: unresolved external symbol "public: static
double common::s_playerMaxHealth" (?s_playerMaxHealth#common##2NA)
EDIT : The problem is static, if i remove static i don't have the error anymore. However i need to use static for it to work as intented.
You must define these variables like so (in your .cpp file, outside of any function):
double common::s_a;
double common::s_b;
This is a declaration (not a definition):
class common
{
static double common::s_a;
static double common::s_b;
This is a use (not a definition either):
common::common()
{
common::s_a = 100;
common::s_b = 100;
}

Unresolved external symbol when using static

I am new to c++. I started now playing with classes and I am having a noob problem with statics.
class Test
{
public:
Test(){};
~Test(){};
static void test();
static Helper* helper;
};
void Test::test()
{
Object obj = Test::helper->getObject();
//...
}
When I try to compile it gives the error:
main.obj : error LNK2001: unresolved external symbol "public: static class Helper* Test::helper" (?helper#Test##2PAVHelper##A)
What is wrong with my code?
The first answer is correct. The reason behind this is that you need to allocate memory for static objects outside the class definition. If you define the the class in a header file, and include it in several cpp files, the compiler doesn't know where and how you want to create the object that 'helper' points to.
you need to define Test::helper. Write something like this outside the class:
Helper* Test::helper = new Helper;

Static members and LNK error in C++

I have a class that has a static member, which I want to use in the class constructor, but the code doesn't compile, and I'm left with these errors:
fatal error LNK1120: 1 unresolved externals
error LNK2001: unresolved external symbol "protected: static class Collection A::collection"
Any help will be appreciated.
Thanks.
a.h:
class A
{
protected:
static Collection<A*> collection;
};
a.cpp:
A::A() {
A::collection.push_back(this);
}
You need to add
Collection<A*> A::collection;
to your a.cpp file.
In your .cpp you need to add:
Collection<A*> A::collection;
The .h only declared that there would be a copy somewhere. You need to provide that copy in the .cpp.
alternatively, if you don't want to put that line in a cpp file, you can use a static method which returns a reference to a static instance... i.e.
class A
{
public:
static Collection<A*>& collection()
{
static Collection<A*> singleInstance;
return singleInstance;
}
};

Linker errors with private members of class in header file

I'm trying to build a project in Visual Studio 2008. I'm getting a bunch of linker errors that are really bothering me. My application is a Win32 console application using only native ANSI C++.
They are all linker errors of the same pattern.
Linker errors are related to every single private static data member of classes I have defined in my own header files.
I'm guessing this is probably a simple fact of c++ I'm not already aware of?
Example:
I refer to the members of SingleDelay within function definitions of SingleDelay's member classes in a file Delays.cpp.
ie:
SingleDelay::tick(void *output, void *input, int nbufferFrames)<br>{
//.. code here<br>
x = dry * castInput + wet * castInput;<br>
}
Error 38 error LNK2001: unresolved external symbol "private: static double SingleDelay::dry" (?dry#SingleDelay##0NA) Delays.obj testall
Definition of SingleDelay in Delays.h:
class SingleDelay{
private:
static double dry; //% of dry signal<br>
static double wet; //% of wet signal<br>
static unsigned int delay; //Delay in milliseconds<br>
static int delayCell; //Index in the delayBuffer of the delay to add<br>
static double *delayBuffer; //Delay buffer is 1 second long at sample rate SAMPLE_RATE<br>
static unsigned int bufferCell; //Pointer to the current delay buffer cell<br>
public:
//Tick function
static void tick(void *output, void *input,int nBufferFrames);
//Set and Get functions
static void setSingleDelay(double tDry, double tWet, unsigned int tDelay);
static void setSingleDelay(void);
static void setDry(double tDry);
static void setWet(double tWet);
static void setDelay(unsigned int tDelay);
static double getDry(){ return dry;}
static double getWet(){ return wet;}
static unsigned int getDelay(){ return delay;}
static void initializeDelayBuffer(){
destroyDelayBuffer();
delayBuffer = new double[bufferLength];
}
static void destroyDelayBuffer(){
delete[ ] delayBuffer;
}
};
They are all linker errors of the same pattern. Linker errors are related to every single private static data member of classes I have defined in my own header files.
All static data members must have a definition in a .cpp file somewhere.
Error 38 error LNK2001: unresolved external symbol "private: static double SingleDelay::dry" (?dry#SingleDelay##0NA) Delays.obj testall
The linker is telling you that there is no defined storage for that variable. This line must appear somewhere in exactly one .cpp file:
double SingleDelay::dry = 0.0;
Maybe you haven't added the library and include paths of the library you use to the project definitions?
C++ error are always fun to look at. Or not. In any case, do you initialize your static variables anywhere? You need to do this in a .cpp file somewhere. And remember to use static variables with care. They are actually global variables in disguise, and can make future changes, such as multi-threading, more difficult.
Maybe error consists in your static fields visibility scope, because they are private.
Try write code that use your privete static field in class definition, not beyond your class.
Write this method just in your class definition:
class SingleDelay{
...
int tick(void *output, void *input, int nbufferFrames)
{ //.. code here
x = dry * castInput + wet * castInput;
}
...
}
You need to add the .cpp and .h files to .vcproj file.