2010-11-30 7 views
4

はここで基本的な構造体(私は願っています)C++行動のconst

struct SomeType { 
    float a; 
    float b; 
    float c; 
    float d; 

    SomeType(float, float, float, float); 
}; 

とソース

SomeType::SomeType(float na, float nb, float nc, float nd) : a(na), b(nb), c(nc), d(nd) {} 

私はそれ

初期化するとザ・私はクラス

struct SomeClass { 
    static const SomeType v; 

    SomeClass(); 
}; 

を持っています

const SomeType SomeClass::v(0,0,0,0); 

私の金額はinfまたはnanまたは-nanになります。誰もこれを以前に見たか、それを修正する方法を知っていますか?

編集:固定タイプ

編集:これは私の元の例に非常に近いです。 SomeClassと同様の構造を持つ複数のクラス。

答えて

2

これらの値が間違っていますか?別のグローバル変数のコンストラクタのようなものであれば、static initialization order fiascoを覚えておいてください。 vのコンストラクタはまだ実行されていない可能性があります。

出力文をSomeTypeコンストラクタに置き、誤った値が表示される前に出力が行われるかどうかを確認します。

+0

私はあなたがお金にちょうどいいと思う – NebulaFox

3
const SomeClass::v(0,0,0,0); 

vのタイプを指定していないため、コンパイルできません。

これ以外の場合、これは私にとってはうまくいく(うまくいきます)。

おそらく、完全なコンパイル可能な例を1つのコードリストに投稿する必要があります。が実際にということを念頭に置いているかどうかを確認することができます。

+0

これは私の実際の例に近いですが、面白いですが、私は複数のSomeClassを別のクラスとして持っています。タイプを修正しました。 – NebulaFox

1

私はその正確な動作を再現しませんでしたが、初期化ではそのタイプが指定されていません。それは次のようにする必要があります。

const SomeType SomeClass::v(0, 0, 0, 0); 

これを実行すると正常に動作します。

+0

SomeClassはインスタンス化されないため、コンストラクタは不要です。 –

+0

真。テストするためにインスタンス化しましたが、 'SomeClass :: v'に直接アクセスできました。編集します。 – Nate

1

作業バージョン:

#include <iostream> 


struct SomeType { 
    float a; 
    float b; 
    float c; 
    float d; 

    SomeType(float, float, float, float); 

public: 

    void print() const 
    { 
     std::cout << this->a << std::endl; 
     std::cout << this->b << std::endl; 
     std::cout << this->c << std::endl; 
     std::cout << this->d << std::endl; 
    } 
}; 

SomeType::SomeType(float na, float nb, float nc, float nd) : a(na), b(nb), c(nc), d(nd) {} 

class SomeClass { 
    static const SomeType v; 

    SomeClass() {} 

public: 

    static void print() 
    { 
     v.print(); 
    } 
}; 

const SomeType SomeClass::v(0.0f,0.0f,0.0f,0.0f); 

void main() 
{ 
    SomeClass::print(); 
} 

出力は次のようになります。SomeType SomeClass::v以来

0

が静的​​であるあなたが本当に明示的にゼロにSomeTypeのメンバーを初期化する必要がありますか?

SomeTypeのメンバを0に初期化する(それ以外の場合はデフォルトのCtor SomeTypeを定義する)ためにのみ使用する場合は、SomeTypeのCtorを初期化しないで、静的メンバをconst SomeType SomeClass::v;として初期化することができます。

1

もう1人の男があなたに問題があると言っていました(静的初期化命令の失敗)。私は1つの解決策をあなたに提供します。あなたは、コンストラクタを取り除く必要があり、その種類は、あなたが唯一の定数式が含まれているブレース初期化子リストで初期化する必要が続いてPOD

struct SomeType { 
    float a; 
    float b; 
    float c; 
    float d; 
}; 

になります(これが唯一の積分定数に限定されるものではないです式の)代わりに

const SomeType SomeClass::v = { 0, 0, 0, 0 }; 

が、唯一のゼロの場合には、明示的な値をオフのままにし、ちょうど空の中括弧

const SomeType SomeClass::v = { }; 
を使用することができます

このような場合、C++は、コードを読み取ろうとする前に値が初期化されることを保証します。