Domanda

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_test_api.proj

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

namepsace_test.proj

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");
}
È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top