2

静的定数を非整数で初期化しようとしています。ただし、プライベートなパラメータが必要です。整数型の場合は、クラス本体に配置して、ある変数が別の変数の値を取ることができるようにすることができます。

static const int A=0;
static const int B=A;

ただし、非整数であるため、クラス本体の外部で初期化する必要がありますが、メンバーはプライベートであるため、クラス本体の外部で範囲外になります。

例えば

//HEADER
class Person
{
    static const float x;
    static const float y;
    static const int rad;
    static const sf::Color col;
    static const sf::Shape shape;
};

//CPP
const float Person::x=0;
const float Person::y=0;
const int Person::rad=16;
const sf::Color Person::col(255,0,0,255);
const sf::Shape shape=sf::Shape::Circle(Person::x,Person::y,Person::rad,Person::col);

Person :: x、Person :: y、Person :: rad、Person :: colはプライベートであるため、範囲外です。静的定数を初期化しているので、新しいインスタンスが作成されるたびに呼び出されるコンストラクターには入れたくありません。

例えば

//HEADER
class Person
{
    static const float x;
    static const float y;
    static const int rad;
    static const sf::Color col;
    static const sf::Shape shape;

    Person();
};

//CPP
const float Person::x=0;
const float Person::y=0;
const int Person::rad=16;
const sf::Color Person::col(255,0,0,255);

Person::Person()
{
    const sf::Shape shape=sf::Shape::Circle(x,y,rad,col);
}

上記はうまくいくようですが、上記の理由で使用したくありません。

回避策はありますか?メンバーを公開せずに。

ありがとう

4

2 に答える 2

1

Personこのパブリック関数をクラスに追加します。

static const sf::Shape defaultShape();

この関数は、プライベート変数へのアクセスと静的Shape変数の初期化の両方を行うことができます。

于 2012-01-24T20:48:20.093 に答える
0

クラスの静的値を使用して他の静的値を計算しないでください。この場合、物事を正しい順序に保つと可能です(静的変数の初期化順序

あなたのクラスの設計は疑わしいです。x、y、rad、col が円でのみ使用される場合は、デフォルトの円を初期化して、それらの変数をまったく持たない方がよい場合があります。

変化する

static const float x ;

の中へ

static float x() { return 0 ; }

于 2012-01-24T21:02:39.187 に答える