Static arrays of objects in C++ in other classes.

J

Jim

Hi,
I'm trying to build a simple data table for all my classes to use. I
don't want to use a vector. The data is stored in class freqoffset

class freqoffset
{
public:
freqoffset():eek:ffset(0),strength(0){};
int set(double offset,double strength);
double getOff() const{return offset;};
double getStr() const{return strength;};
private:
double offset,strength;
};

int freqoffset::set(double off,double str)
{
offset=off;
strength=str;
return 0;
}

And the class with the data in (cut down significantly) is;
class nh3fitting
{
private:
static const int sn1=18;
static const int sn2=21;
static freqoffset s1[sn1];
static freqoffset s2[sn2];
public:
nh3fitting(double cr, double cd, int n, double sd); //generates an
array and populates it with x values

static int loadArrays();

};

int nh3fitting::loadArrays()
{
s1[0].set( -1.56893, 0.0741);
s1[1].set(-1.526658 , 0.1481);
s1[2].set(-0.623335 , 0.0926);
s1[3].set( -0.590375, 0.1667);
s1[4].set(-0.581021, 0.0185);
s1[5].set(-0.036389 , 0.0370);
s1[6].set(-0.025453 , 0.0185);
s1[7].set(-0.024583, 0.0333);
s1[8].set(-0.015196, 0.3);
s1[9].set(0.005941, 0.0185);
s1[10].set(0.010463, 0.4667);
s1[11].set(0.016835, 0.0926);
s1[12].set(0.019832, 0.0333);
s1[13].set(0.571708, 0.0926);
s1[14].set(0.582719, 0.0185);
s1[15].set(0.617689 , 0.1667);
s1[16].set(1.53405, 0.0741);
s1[17].set(1.545159, 0.1481);

s2[0].set(-2.099033 ,0.0042 );
s2[1].set(-2.058267 , 0.0377);
s2[2].set( -2.053459, 0.0209);
s2[3].set(-1.297087, 0.0372);
s2[4].set(-1.296079,0.026 );
s2[5].set(-1.255384, 0.0019);
s2[6].set(-0.044498, 0.0209);
s2[7].set(-0.041806, 0.0106);
s2[8].set(-0.041456, 0.0116);
s2[9].set(-0.001031, 0.1465);
s2[10].set(0.000309, 0.4997);
s2[11].set(0.001054, 0.2674);
s2[12].set(0.039736, 0.0106);
s2[13].set(0.042055, 0.0116);
s2[14].set(0.046621 , 0.0209);
s2[15].set(1.254559, 0.0019);
s2[16].set(1.295363, 0.026);
s2[17].set(1.296295, 0.0377);
s2[18].set(2.053476, 0.0209);
s2[19].set(2.058256, 0.0377);
s2[20].set(2.099022, 0.0042);

return 0;
}

Problem is that I get the following error in linking when I try and
compile it.
g++ -I/usr/include/gsl/ -L/usr/lib/ -c nh3fit.cpp
g++ -I/usr/include/gsl/ -L/usr/lib/ -lgsl -lgslcblas nh3fit.o -o
nh3fit
nh3fit.o: In function `nh3fitting::loadArrays()':
nh3fit.cpp:(.text+0xb7): undefined reference to `nh3fitting::s1'
nh3fit.cpp:(.text+0xd9): undefined reference to `nh3fitting::s1'
nh3fit.cpp:(.text+0xfb): undefined reference to `nh3fitting::s1'
nh3fit.cpp:(.text+0x11d): undefined reference to `nh3fitting::s1'
nh3fit.cpp:(.text+0x13f): undefined reference to `nh3fitting::s1'

and so on, but I've no way of solving this without changing the
structure of the code.

Any help would be greatly appreciated.
Jim
 
J

Jim

Jim said:
Hi,
I'm trying to build a simple data table for all my classes to use. I
don't want to use a vector. The data is stored in class freqoffset
class freqoffset
{
public:
freqoffset():eek:ffset(0),strength(0){};
int set(double offset,double strength);
double getOff() const{return offset;};
double getStr() const{return strength;};
private:
double offset,strength;
};
int freqoffset::set(double off,double str)
{
offset=off;
strength=str;
return 0;
}
And the class with the data in (cut down significantly) is;
class nh3fitting
{
private:
static const int sn1=18;
static const int sn2=21;
static freqoffset s1[sn1];
static freqoffset s2[sn2];
public:
nh3fitting(double cr, double cd, int n, double sd); //generates an
array and populates it with x values
static int loadArrays();

int nh3fitting::loadArrays()
{
s1[0].set( -1.56893, 0.0741);
s1[1].set(-1.526658 , 0.1481);
s1[2].set(-0.623335 , 0.0926);
s1[3].set( -0.590375, 0.1667);
s1[4].set(-0.581021, 0.0185);
s1[5].set(-0.036389 , 0.0370);
s1[6].set(-0.025453 , 0.0185);
s1[7].set(-0.024583, 0.0333);
s1[8].set(-0.015196, 0.3);
s1[9].set(0.005941, 0.0185);
s1[10].set(0.010463, 0.4667);
s1[11].set(0.016835, 0.0926);
s1[12].set(0.019832, 0.0333);
s1[13].set(0.571708, 0.0926);
s1[14].set(0.582719, 0.0185);
s1[15].set(0.617689 , 0.1667);
s1[16].set(1.53405, 0.0741);
s1[17].set(1.545159, 0.1481);
s2[0].set(-2.099033 ,0.0042 );
s2[1].set(-2.058267 , 0.0377);
s2[2].set( -2.053459, 0.0209);
s2[3].set(-1.297087, 0.0372);
s2[4].set(-1.296079,0.026 );
s2[5].set(-1.255384, 0.0019);
s2[6].set(-0.044498, 0.0209);
s2[7].set(-0.041806, 0.0106);
s2[8].set(-0.041456, 0.0116);
s2[9].set(-0.001031, 0.1465);
s2[10].set(0.000309, 0.4997);
s2[11].set(0.001054, 0.2674);
s2[12].set(0.039736, 0.0106);
s2[13].set(0.042055, 0.0116);
s2[14].set(0.046621 , 0.0209);
s2[15].set(1.254559, 0.0019);
s2[16].set(1.295363, 0.026);
s2[17].set(1.296295, 0.0377);
s2[18].set(2.053476, 0.0209);
s2[19].set(2.058256, 0.0377);
s2[20].set(2.099022, 0.0042);
return 0;
}
Problem is that I get the following error in linking when I try and
compile it.
g++ -I/usr/include/gsl/ -L/usr/lib/ -c nh3fit.cpp
g++ -I/usr/include/gsl/ -L/usr/lib/ -lgsl -lgslcblas nh3fit.o -o
nh3fit
nh3fit.o: In function `nh3fitting::loadArrays()':
nh3fit.cpp:(.text+0xb7): undefined reference to `nh3fitting::s1'
nh3fit.cpp:(.text+0xd9): undefined reference to `nh3fitting::s1'
nh3fit.cpp:(.text+0xfb): undefined reference to `nh3fitting::s1'
nh3fit.cpp:(.text+0x11d): undefined reference to `nh3fitting::s1'
nh3fit.cpp:(.text+0x13f): undefined reference to `nh3fitting::s1'
and so on, but I've no way of solving this without changing the
structure of the code.

Correct, you don't. You need to _define_ any static data member in your
class if it's used outside of the class. FAQ 10.11. Always read the
FAQ before posting.

V

s1 and s2 are only ever used in static members of that class. Read
10.11 but not really sure how to apply it to the case of creating
static arrays of user-defined classes. I would have thought that the
objects are defined, they've got a default constructor which
initialises each of them, so things would have been fine.
I've tried changing
static freqoffset s1[sn1];
static freqoffset s2[sn2];
to
static freqoffset s1;
static freqoffset s2;
and placing
freqoffset nh3fitting::s1[sn1];
freqoffset nh3fitting::s2[sn2];
outside the class definition, but can't get it to work.

Any advice?
Jim
 
J

Jim

Jim said:
[..]
s1 and s2 are only ever used in static members of that class.

It does not matter where outside of the class definition they are used.
They are used, they need to be defined.
Read


10.11 but not really sure how to apply it to the case of creating
static arrays of user-defined classes. I would have thought that the
objects are defined, they've got a default constructor which
initialises each of them, so things would have been fine.
I've tried changing
static freqoffset s1[sn1];
static freqoffset s2[sn2];
to
static freqoffset s1;
static freqoffset s2;
and placing
freqoffset nh3fitting::s1[sn1];
freqoffset nh3fitting::s2[sn2];
outside the class definition, but can't get it to work.
Any advice?

Yes, follow this example (which isn't supposed to link as written):

class foo {
static int array[42];
public:
static void bar();
};

// int foo::array[42] = {}; // uncomment to make it link

void foo::bar()
{
array[0] = 666;
}

int main()
{
}

V

Marvellous, I've not seen that notation used before, thanks!

On a related note, if you're willing to help?
In my header, I have a whole bunch of constants defined which are used
throughout the program in static methods, as follows;
class nh3fitting
{
private:
static const double t0=41.5;
static const double v11= 23694.495;
static const double v22= 23722.622;
};

v11 and v22 work, but t0 only works in some static methods but not
others. If I follow the FAQ and define it outside the header. i.e.
class nh3fitting
{
private:
static const double t0;
static const double v11= 23694.495;
static const double v22= 23722.622;
};
double const nh3fitting::t0=41.5;

Everything works and compiles.
I'm using gcc. Do you have any idea why this might be?
Thank you very much,
Jim
 
N

Noah Roberts

Jim said:
On a related note, if you're willing to help?
In my header, I have a whole bunch of constants defined which are used
throughout the program in static methods, as follows;
class nh3fitting
{
private:
static const double t0=41.5;
static const double v11= 23694.495;
static const double v22= 23722.622;
};

v11 and v22 work, but t0 only works in some static methods but not
others. If I follow the FAQ and define it outside the header. i.e.
class nh3fitting
{
private:
static const double t0;
static const double v11= 23694.495;
static const double v22= 23722.622;
};
double const nh3fitting::t0=41.5;

Everything works and compiles.
I'm using gcc. Do you have any idea why this might be?
Thank you very much,
Jim

You can only initialize data objects in a class declaration if they are
static constant integrals. I don't know why v11 and v22 are working for
you; as far as I know they should not.
 
J

Jim

You can only initialize data objects in a class declaration if they are
static constant integrals. I don't know why v11 and v22 are working for
you; as far as I know they should not.

static constant integrals? Do you mean static const int? It's very odd
as I use t0 in three static methods and only get a linker error from
two.I've checked the code and it seems good.
Jim
 
L

Lionel B

You can only initialize data objects in a class declaration if they are
static constant integrals. I don't know why v11 and v22 are working for
you; as far as I know they should not.

I've just checked my current gcc (4.3.1) and I find that without the
`-pedantic' flag it *will* accept non-integral static member
initialisation, even if -std=c++98 is specified (go figure...). With
`-pedantic' I get:

error: ISO C++ forbids initialization of member constant ‘x’ of non-
integral type ‘const double’

It is an unfortunate fact of life that most compilers seem to default to
non-standards compliance. I generally use gcc with (at least) `-std=c++98
-pedantic -Wall -Werror -Wextra' (I recall that James Kanze recently
posted a rather more extensive list of options to cajole gcc into strict
standards compliance).
 

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,769
Messages
2,569,582
Members
45,066
Latest member
VytoKetoReviews

Latest Threads

Top