在一个类中声明一个 static const 类型的数组,请问在哪里初始化?

时间:2022-10-29 13:33:57
在一个类中声明一个 static const 类型的数组,请问在哪里初始化?



class test
{
public:
...
protected:
static const float t_sinf[360]
};



t_sinf的值都为  sinf(i);

请问如何初始化?

33 个解决方案

#1


class test
{
public:
static const float t_sinf[2];
};

const float test::t_sinf[] = {1,2};

#2


360 个啊,

#3


类里的一般的静态数据成员,都在实现里面初始化,也就是你给成员函数实际定义的地方
不过如果是const的话,你可以在声明里面初始化,通常你还需要一个定义,并且定义不可以再初始化.

你上面的代码可以如下初始化:



float sinf[360];

for(int i=0;i<360;i++)
{
sinf[i]=sin(i);
}

class test
{
public:
...
protected:
static const float t_sinf[360]={sinf[0],sinf[1],...sinf[359]};  //class专属常量可以在声明中初始化
};

const float t_sinf[360] ;           //不能再初始化


上面初始化我省略了,自己定义时当然不能省略.这样一整个数组也太大了点,可以考虑用指针

#4


class test
{
public:
static const float t_sinf[360];
};

const float test::t_sinf[] = {1,2};//后面的默认为0


360,楼主想怎么初始化呢?

#5


打错了
const float t_sinf[360] ;           //不能再初始化

上面应该是 const float test::t_sinf[360] ;           //不能再初始化

#6




给你举个例子就明白了

#include<iostream>

using namespace std;
class A
{
static int a[2];
public:
static void print()
{
cout<<a[0]<<endl<<a[1]<<endl;
}
};
int A::a[2]={1,2};
int main()
{
A b;
b.print();
return 0;

}

#7


这个数组太多了,何苦要弄成const static呢,用的函数初始化不就很好吗?

#8


我想在class 中打个表啊,为了速度,所以把sin打到表中。这是不需要声明称每个对象的变量的,所以声明称static的,做成360个像3楼那样。我想会疯掉,用指针还不如定义在外面做个static,我只是想封装的好一点,想问问各位有工程经验的怎么做的。

#9


static const 只能在声明的同时初始化,并且只能是整数型的变量

#10


effective c++有说到这个问题.楼主有空可以看看.

如果是class专属常量并且是static,且为整型(int,char,bool),需特殊处理.只要不取地址,可以在声明中初始化,并且不需要定义式.

如果你取地址或者编译器坚持要看到一个定义式,可以在实现中定义,并且不能再初始化.

旧式编译器可能不支持这种在声明时赋初值的语法.这时就要在定义时赋予初值.

#11


楼上的扯了吧,我都用过其他类型的,c++primer上还有个例子是char型的

#12


我说错了,不是楼上,是9楼

#13


10楼说的是哪一条?我手上有这本书

#14


条款02:尽量以const,enum,inline 替换#define

page 14
line 10

#15


说了等于没说。。。这个我知道,主要是量太大了的原因。

#16


我觉得你所要求的可能是无解。

你要初始化一个大数组又不想一个个赋值,那就用默认的0吧。

我想,既然想封装成一个自带了大量数据的类,那定义这些数据本来就是自己分内的事吧.
不然,这些数据就可以放在全局数据或者外部文件里面。不想破坏封装性当然只能自己定义.

象这类正弦表我觉得一般都是放在全局数据或者文件里面,类是可以使用,似乎没必要自带

#17


9楼说的对的
C++里面只允许我们对整型,和枚举类型初始化静态成员变量,

#18


C++里面只允许我们对整型初始化?真的假的?

c++ primer 4th 中文版 402 页有

class Screen{
public:
//
//
Screen& clear(char = bkground);
private:
static const char bkground = '#';
};

这是错的,还是你是错的?我糊涂了

#19


float 类型必须在外面定义初始化

#20


char也是“整型”

#21


先写个小程序,自动生成你要的360个数据即可。

#22


char也是“整型”
——————————————————————————
对了,char 就是一个整数
char * 也是一个整数

#23


其实就是一个理解的问题,你把这个地方的整型理解成整数型,CHAR字符也是一个整数,不会是小数吧,另外还有BOOL也属于整数型

#24


class A
{
public:
static const int a = 1;
};

为什么报
error C2258: illegal pure syntax, must be '= 0'
error C2252: 'a' : pure specifier can only be specified for functions

#25


楼上用的是VC6吧,扔了换VC2005express或者wxdevcpp

#26


的确是vc6

#27


The Boolean, character, and integer types are collectively called integral types.
我们将布尔量、字符和整数类型放到一起称为整型。
    --《TC++PL》

#28


好多东西都忘了,来这里拾起回忆哈!

#29


在声明的时候初始化

#30


const 意味着常量初始化,static 意味在构造函数定义时初始化也不行。
static const 静态常量整型数据成员可以在类中初始化,但你也不想这么做。
所以个人觉得得自己填写这些数据了。下面建议代码,请看看可行不:

#include <math.h>

class A
{
public:
//...
static const float getSin(int index)
{
static const float t_sin[] = { sin((float)0),
sin((float)0), sin((float)2), sin((float)3),
//...
sin((float)359)};
return t_sin[index%360];
}
};

#31


可以用类的构造函数初始化,而且简单!设为私有成员。

#32


同意30楼的说法

#33


汗!我还是用了个全局函数,做了个全局变量算了。结贴,多谢各位

#1


class test
{
public:
static const float t_sinf[2];
};

const float test::t_sinf[] = {1,2};

#2


360 个啊,

#3


类里的一般的静态数据成员,都在实现里面初始化,也就是你给成员函数实际定义的地方
不过如果是const的话,你可以在声明里面初始化,通常你还需要一个定义,并且定义不可以再初始化.

你上面的代码可以如下初始化:



float sinf[360];

for(int i=0;i<360;i++)
{
sinf[i]=sin(i);
}

class test
{
public:
...
protected:
static const float t_sinf[360]={sinf[0],sinf[1],...sinf[359]};  //class专属常量可以在声明中初始化
};

const float t_sinf[360] ;           //不能再初始化


上面初始化我省略了,自己定义时当然不能省略.这样一整个数组也太大了点,可以考虑用指针

#4


class test
{
public:
static const float t_sinf[360];
};

const float test::t_sinf[] = {1,2};//后面的默认为0


360,楼主想怎么初始化呢?

#5


打错了
const float t_sinf[360] ;           //不能再初始化

上面应该是 const float test::t_sinf[360] ;           //不能再初始化

#6




给你举个例子就明白了

#include<iostream>

using namespace std;
class A
{
static int a[2];
public:
static void print()
{
cout<<a[0]<<endl<<a[1]<<endl;
}
};
int A::a[2]={1,2};
int main()
{
A b;
b.print();
return 0;

}

#7


这个数组太多了,何苦要弄成const static呢,用的函数初始化不就很好吗?

#8


我想在class 中打个表啊,为了速度,所以把sin打到表中。这是不需要声明称每个对象的变量的,所以声明称static的,做成360个像3楼那样。我想会疯掉,用指针还不如定义在外面做个static,我只是想封装的好一点,想问问各位有工程经验的怎么做的。

#9


static const 只能在声明的同时初始化,并且只能是整数型的变量

#10


effective c++有说到这个问题.楼主有空可以看看.

如果是class专属常量并且是static,且为整型(int,char,bool),需特殊处理.只要不取地址,可以在声明中初始化,并且不需要定义式.

如果你取地址或者编译器坚持要看到一个定义式,可以在实现中定义,并且不能再初始化.

旧式编译器可能不支持这种在声明时赋初值的语法.这时就要在定义时赋予初值.

#11


楼上的扯了吧,我都用过其他类型的,c++primer上还有个例子是char型的

#12


我说错了,不是楼上,是9楼

#13


10楼说的是哪一条?我手上有这本书

#14


条款02:尽量以const,enum,inline 替换#define

page 14
line 10

#15


说了等于没说。。。这个我知道,主要是量太大了的原因。

#16


我觉得你所要求的可能是无解。

你要初始化一个大数组又不想一个个赋值,那就用默认的0吧。

我想,既然想封装成一个自带了大量数据的类,那定义这些数据本来就是自己分内的事吧.
不然,这些数据就可以放在全局数据或者外部文件里面。不想破坏封装性当然只能自己定义.

象这类正弦表我觉得一般都是放在全局数据或者文件里面,类是可以使用,似乎没必要自带

#17


9楼说的对的
C++里面只允许我们对整型,和枚举类型初始化静态成员变量,

#18


C++里面只允许我们对整型初始化?真的假的?

c++ primer 4th 中文版 402 页有

class Screen{
public:
//
//
Screen& clear(char = bkground);
private:
static const char bkground = '#';
};

这是错的,还是你是错的?我糊涂了

#19


float 类型必须在外面定义初始化

#20


char也是“整型”

#21


先写个小程序,自动生成你要的360个数据即可。

#22


char也是“整型”
——————————————————————————
对了,char 就是一个整数
char * 也是一个整数

#23


其实就是一个理解的问题,你把这个地方的整型理解成整数型,CHAR字符也是一个整数,不会是小数吧,另外还有BOOL也属于整数型

#24


class A
{
public:
static const int a = 1;
};

为什么报
error C2258: illegal pure syntax, must be '= 0'
error C2252: 'a' : pure specifier can only be specified for functions

#25


楼上用的是VC6吧,扔了换VC2005express或者wxdevcpp

#26


的确是vc6

#27


The Boolean, character, and integer types are collectively called integral types.
我们将布尔量、字符和整数类型放到一起称为整型。
    --《TC++PL》

#28


好多东西都忘了,来这里拾起回忆哈!

#29


在声明的时候初始化

#30


const 意味着常量初始化,static 意味在构造函数定义时初始化也不行。
static const 静态常量整型数据成员可以在类中初始化,但你也不想这么做。
所以个人觉得得自己填写这些数据了。下面建议代码,请看看可行不:

#include <math.h>

class A
{
public:
//...
static const float getSin(int index)
{
static const float t_sin[] = { sin((float)0),
sin((float)0), sin((float)2), sin((float)3),
//...
sin((float)359)};
return t_sin[index%360];
}
};

#31


可以用类的构造函数初始化,而且简单!设为私有成员。

#32


同意30楼的说法

#33


汗!我还是用了个全局函数,做了个全局变量算了。结贴,多谢各位