468,765 Members | 811 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,765 developers. It's quick & easy.

linkage error when initializing static member array

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

Thank you to all the people in the newsgroup,
Neno.
Jul 22 '05 #1
2 1842
"Neno" <m_**********@tiscali.it> wrote...
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
Jul 22 '05 #2
Thank you !
It works now. :-)
Bye.

"Victor Bazarov" <v.********@comAcast.net> ha scritto nel messaggio
news:CUied.173088$He1.158957@attbi_s01...
"Neno" <m_**********@tiscali.it> wrote...
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

Jul 22 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

9 posts views Thread by qazmlp | last post: by
20 posts views Thread by Grumble | last post: by
10 posts views Thread by Mark A. Gibbs | last post: by
4 posts views Thread by Mantorok Redgormor | last post: by
6 posts views Thread by Neelesh Bodas | last post: by
3 posts views Thread by al.cpwn | last post: by
13 posts views Thread by fctk | last post: by
2 posts views Thread by Nagrik | last post: by
12 posts views Thread by Taras_96 | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by Marin | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.