Инициализировать статический const, нецелый член класса с закрытым членом - PullRequest
2 голосов
/ 25 января 2012

Я пытаюсь инициализировать статический констант нецелым. Однако это требует параметров, которые являются частными. Если бы он имел целочисленный тип, вы могли бы поместить его в тело класса и позволить одной переменной принимать значение другой, т.е.

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

Кажется, что вышеприведенное работает, но я не хочу использовать его по вышеуказанной причине.

Есть ли обходной путь? Без обнародования членов.

Спасибо

Ответы [ 2 ]

1 голос
/ 25 января 2012

Добавьте эту публичную функцию к вашему Person классу.

static const sf::Shape defaultShape();

Эта функция может как обращаться к закрытым переменным, так и инициализировать вашу статическую Shape переменную.

0 голосов
/ 25 января 2012

Не используйте статическое значение из класса для вычисления других статических значений. В этом случае это возможно, если вы держите вещи в правильном порядке ( Порядок инициализации статических переменных )

Дизайн ваших классов подозрительный. Если x, y, rad, col используются только в круге, может быть лучше просто инициализировать окружность по умолчанию и вообще не иметь этих переменных.

изменить

static const float x ;

в

static float x() { return 0 ; }

и т.д..

...