linkage error when initializing static member array

N

Neno

Hi,
I have a linkage error that has something to do with the use of a static
member array and I can't understand how to solve the problem. Can someone
help me please?
In detail:
A class Month (it is just an unsafe and useless example) has protected
constructors so that Month objects can be obtained only through a static
member function named getMonth.
Month class has a private static array named months made of 12 pointers to
Month objects and I would like getMonths to populate the array when
necessary and return just the objects in the array.
The problem is that the linker complains with :
unresolved external symbol "private: static class Month * * Month::months"

The code below is the header and cpp files for the class Month.

----- Month.h -----------------------------
class Month {
public:
virtual ~Month();
static Month *getMonth(int num);
const int numOfDays;
protected:
Month(int num);
Month(Month const &copy);
private:
static Month *months[12];
};
------ Month.cpp -----------------------------
#include "Month.h"

Month::Month(int num) : numOfDays(num) {}

Month::Month(Month const &copy) : numOfDays(copy.numOfDays) {}

Month::~Month() {
for (int num = 0; num < 12; num++)
if (months[num]) delete months[num];
}

Month *Month::getMonth(int num) {
if (! months[num]) {
switch (num) {
case 1:
months[num] = new Month(29); break;
case 8:
case 5:
case 3:
case 10:
months[num] = new Month(30); break;
default:
months[num] = new Month(31);
}
}
return months[num];
}
 
V

Victor Bazarov

Neno said:
I have a linkage error that has something to do with the use of a static
member array and I can't understand how to solve the problem. Can someone
help me please?

Static data members have to be defined. You need to place the definition
at the namespace level where your class is declared.
In detail:
A class Month (it is just an unsafe and useless example) has protected
constructors so that Month objects can be obtained only through a static
member function named getMonth.
Month class has a private static array named months made of 12 pointers to
Month objects and I would like getMonths to populate the array when
necessary and return just the objects in the array.
The problem is that the linker complains with :
unresolved external symbol "private: static class Month * *
Month::months"

The code below is the header and cpp files for the class Month.

----- Month.h -----------------------------
class Month {
public:
virtual ~Month();
static Month *getMonth(int num);
const int numOfDays;
protected:
Month(int num);
Month(Month const &copy);
private:
static Month *months[12];
};
------ Month.cpp -----------------------------
#include "Month.h"

Add here:

Month *Month::months[12] = { 0 };
Month::Month(int num) : numOfDays(num) {}

Month::Month(Month const &copy) : numOfDays(copy.numOfDays) {}

Month::~Month() {
for (int num = 0; num < 12; num++)
if (months[num]) delete months[num];

Add setting them to 0 too.
}

Month *Month::getMonth(int num) {
if (! months[num]) {
switch (num) {
case 1:
months[num] = new Month(29); break;
case 8:
case 5:
case 3:
case 10:
months[num] = new Month(30); break;
default:
months[num] = new Month(31);
}
}
return months[num];
}
----------------------------------------------------

V
 
N

Neno

Thank you !
It works now. :)
Bye.

Victor Bazarov said:
Neno said:
I have a linkage error that has something to do with the use of a static
member array and I can't understand how to solve the problem. Can someone
help me please?

Static data members have to be defined. You need to place the definition
at the namespace level where your class is declared.
In detail:
A class Month (it is just an unsafe and useless example) has protected
constructors so that Month objects can be obtained only through a static
member function named getMonth.
Month class has a private static array named months made of 12 pointers to
Month objects and I would like getMonths to populate the array when
necessary and return just the objects in the array.
The problem is that the linker complains with :
unresolved external symbol "private: static class Month * *
Month::months"

The code below is the header and cpp files for the class Month.

----- Month.h -----------------------------
class Month {
public:
virtual ~Month();
static Month *getMonth(int num);
const int numOfDays;
protected:
Month(int num);
Month(Month const &copy);
private:
static Month *months[12];
};
------ Month.cpp -----------------------------
#include "Month.h"

Add here:

Month *Month::months[12] = { 0 };
Month::Month(int num) : numOfDays(num) {}

Month::Month(Month const &copy) : numOfDays(copy.numOfDays) {}

Month::~Month() {
for (int num = 0; num < 12; num++)
if (months[num]) delete months[num];

Add setting them to 0 too.
}

Month *Month::getMonth(int num) {
if (! months[num]) {
switch (num) {
case 1:
months[num] = new Month(29); break;
case 8:
case 5:
case 3:
case 10:
months[num] = new Month(30); break;
default:
months[num] = new Month(31);
}
}
return months[num];
}
----------------------------------------------------

V
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,021
Latest member
AkilahJaim

Latest Threads

Top