Hi there fellow nerds,
i got a problem while tryin to code a static library. Im trying to set a private class member with a public class function. The class is located in a namespace. When i try to compile the example program (namespace_test) i get a LNK2001 Error stating a not resolved external symbol.
(Fehler 1 error LNK2001: Nicht aufgelöstes externes Symbol ""private: static bool ns_test::CTest::m_bPrivateMember" (?m_bPrivateMember@CTest@ns_test@@0_NA)". ...\ns_test\namespace_test\namespace_test_api.lib(CTest.obj) namespace_test )
How can i correctly implement that function?
Here is my code:
namespace.h
namespace ns_test
{
class CTest
{
public:
CTest();
~CTest();
static void SetPrivateMember(bool i_bPrivateMember);
static bool bGetPrivateMember();
private:
static bool m_bPrivateMember;
};
}
CTest.cpp
#include "namespace.h"
namespace ns_test
{
CTest::CTest()
{
}
CTest::~CTest()
{
}
void CTest::SetPrivateMember(bool i_bPrivateMember)
{
CTest::m_bPrivateMember = i_bPrivateMember;
}
bool CTest::bGetPrivateMember()
{
return CTest::m_bPrivateMember;
}
}
namspace.h
namespace ns_test
{
class CTest
{
public:
CTest();
~CTest();
static void SetPrivateMember(bool i_bPrivateMember);
static bool bGetPrivateMember();
private:
static bool m_bPrivateMember;
};
}
main.cpp
#include <Windows.h>
#include <iostream>
#include "namespace.h"
#pragma comment (lib, "namespace_test_api.lib")
int main()
{
ns_test::CTest::SetPrivateMember(true);
std::cout << "PrivateMember: " << ns_test::CTest::bGetPrivateMember() << std::endl;
system("pause");
}
In CTest.cpp, you need to add the line:
bool ns_test::CTest::m_bPrivateMember;
This defines
the static member, the entry in the class only declares
it.
Note that the above will initialise it with false
. You may want to make that explicit, or true
:
bool ns_test::CTest::m_bPrivateMember = true;
Note this is an example of the One Definition Rule: you need to define
each global exactly once.