0

I'm beginner C++ programmer, and I have no idea how to fix this code. I found the reason of problem on Stack OverFlow, but I didn't find the solution for my case.

Error list

    LNK2005 "int X::var" (?var@X@@3HA) already defined in HeaderRealiseOne.obj 
    LNK2005 "int Y::var" (?var@Y@@3HA) already defined in HeaderRealiseOne.obj 
    LNK2005 "int Z::var" (?var@Z@@3HA) already defined in HeaderRealiseOne.obj 
    LNK1169 one or more multiply defined symbols found 

main.cpp

    #include "HeaderInterfaceOne.h"

    int main()
    {
        X::var = 7;
        X::print();

        using namespace Y;

        var = 9;
        print();

        {
            using Z::var;
            using Z::print;

            var = 11;
            print();
        }

        print();

        X::print();

        cout << endl;

        system("pause");
        return 0;
    }

HeaderInterfaceOne.h

    #pragma once

    #include <iostream>
    using namespace std;

    namespace X
    {
        int var;
        void print();
    }

    namespace Y
    {
        int var;
        void print();
    }

    namespace Z
    {
        int var;
        void print();
    }

HeaderRealiseOne.cpp

    #include "HeaderInterfaceOne.h"

    void X::print() { cout << "X = " << X::var << endl; }
    void Y::print() { cout << "Y = " << Y::var << endl; }
    void Z::print() { cout << "Z = " << Z::var << endl; }

At first, I thought I need to add extern before int var in all namespaces:

    namespace X
    {
        extern int var;
        void print();
    }

    namespace Y
    {
        extern int var;
        void print();
    }

    namespace Z
    {
        extern int var;
        void print();
    }

but it caused another problem:

    LNK2001 unresolved external symbol "int X::var" (?var@X@@3HA)
    LNK2001 unresolved external symbol "int X::var" (?var@X@@3HA)

    LNK2001 unresolved external symbol "int Y::var" (?var@Y@@3HA)
    LNK2001 unresolved external symbol "int Y::var" (?var@Y@@3HA)

    LNK2001 unresolved external symbol "int Z::var" (?var@Z@@3HA)
    LNK2001 unresolved external symbol "int Z::var" (?var@Z@@3HA)

    LNK1120 3 unresolved externals

Please, help to fix it.

Thanks!

Airat K
  • 55
  • 1
  • 1
  • 10

1 Answers1

0

The second approach is correct. You just need to define the extern variables in a .cpp file.

Adding

int X::var = 0;
int Y::var = 0;
int Z::var = 0;

to HeaderRealiseOne.cpp will solve the problem.

R Sahu
  • 204,454
  • 14
  • 159
  • 270