我有一个名为AppSettings的类,其中我有一个具有一系列音符频率的数组。我在下面的代码中遇到了几个错误,我不确定问题是什么。
错误消息是:
static data member of type 'const float [36] must be initialized out of line
A brace enclosed initializer is not allowed here before '{' token
Invalid in-class initialization of static data member of non-integral type
代码:
class AppSettings{
public:
static const float noteFrequency[36] = {
// C C# D D# E F F# G G# A A# B
130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185.00, 196.00, 207.65, 220.00, 223.08, 246.94,
261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00, 466.16, 493.88,
523.25, 554.37, 587.33, 622.25, 659.25, 698.46, 739.99, 783.99, 830.61, 880.00, 932.33, 987.77
};
};
顾名思义,这只是一个头文件,其中包含我在整个应用程序中需要的一些设置和值。
答案 0 :(得分:18)
您无法在班级中定义static
班级成员的值。你需要在课堂上有这样的一行:
class AppSettings
{
public:
static const float noteFrequency[];
然后在类的实现文件中(或许AppSettings.cpp
):
const float AppSettings::noteFrequency[] = { /* ... */ };
此外,您无需在此处[]
中指定数字,因为C ++非常智能,可以计算初始化值中元素的数量。
答案 1 :(得分:10)
这在C ++ 11中运行得很好
class AppSettings{
public:
static constexpr float noteFrequency[36] = {
// C C# D D# E F F# G G# A A# B
130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185.00, 196.00, 207.65, 220.00, 223.08, 246.94,
261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00, 466.16, 493.88,
523.25, 554.37, 587.33, 622.25, 659.25, 698.46, 739.99, 783.99, 830.61, 880.00, 932.33, 987.77
};
};
答案 2 :(得分:7)
C ++ 03不支持复杂数据的类内定义,如常量数组。
要在头文件中的命名空间范围内放置此类定义,并避免违反单一定义规则,您可以对模板类使用特殊豁免,如下所示:
#include <iostream>
using namespace std;
//----------------------------------------- BEGIN header file region
template< class Dummy >
struct Frequencies_
{
static const double noteFrequency[36];
};
template< class Dummy >
double const Frequencies_<Dummy>::noteFrequency[36] =
{
// C C# D D# E F F# G G# A A# B
130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185.00, 196.00, 207.65, 220.00, 223.08, 246.94,
261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00, 466.16, 493.88,
523.25, 554.37, 587.33, 622.25, 659.25, 698.46, 739.99, 783.99, 830.61, 880.00, 932.33, 987.77
};
class AppSettings
: public Frequencies_<void>
{
public:
};
//----------------------------------------- END header file region
int main()
{
double const a = AppSettings::noteFrequency[21];
wcout << a << endl;
}
还可以使用其他一些技术:
内联函数,用于生成对数组的引用(或用作索引器)。
将定义放在单独编译的文件中。
只需根据需要计算数字。
如果没有更多信息,我不想为你做出选择,但这不应该是一个艰难的选择。