18

私は 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
    };

};

名前が示すように、これはアプリ全体で必要な設定と値を含む単なるヘッダー ファイルです。

4

3 に答える 3

30

staticクラス内でクラス メンバーの値を定義することはできません。クラスに次のような行が必要です。

class AppSettings
{
public:
    static const float noteFrequency[];

そして、クラスの実装ファイルで(AppSettings.cppおそらく):

const float AppSettings::noteFrequency[] = { /* ... */ };

また、ここで数値を指定する必要はありません[]。C++ は初期化値の要素数を数えられるほどスマートだからです。

于 2012-07-27T18:38:21.883 に答える
13

これは 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
    };

};
于 2012-07-27T19:01:43.083 に答える
7

C++03 は、定数の配列などの複雑なデータのクラス内定義をサポートしていません。

このような定義をヘッダー ファイルの名前空間スコープに配置し、1 つの定義規則に違反しないようにするには、次のように、テンプレート クラスの特別な免除を利用できます。

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

他にも使用できるテクニックがいくつかあります。

  • 配列への参照を生成する (またはインデクサーとして使用される) インライン関数。

  • 個別にコンパイルされたファイルに定義を配置します。

  • 必要に応じて数値を計算するだけです。

これ以上の情報がなければ、私はあなたのために選択をしたくありませんが、難しい選択ではありません.

于 2012-07-27T18:55:03.353 に答える