2015-12-06 5 views
-1

У меня есть класс, которому нужен элемент static const variable. Значение для этого класса будет известно во время выполнения пользователем. Я прочитал много сообщений, но до сих пор ни одно из решений не работает. Я знаю, что этот пост:Лучший способ инициализировать переменную типа "static const" класса в главном

Can I initialize a static const member at run-time in C++?

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

Рассмотрим это:

#include 

class A { 
    friend void foo(int); 
    static int dummy; 
public: 
    static const int &T; 
}; 

const int &A::T = A::dummy; 
int A::dummy = 0; 

void foo(int val) { A::dummy = val; } 

int main() { 
    foo(10); 
    std::cout << A::T << std::endl; 
    foo(12); 
    std::cout << A::T << std::endl; 
} 

Программа будет собирать и записывать 10 и 12 в консоли. Wich поражает цель определителя const. Здесь const является ссылкой, а не значением. Поэтому я пришел к выводу, что во время выполнения невозможно иметь статическую переменную класса const!

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

Так что если кто-то знает простое решение, сообщите нам об этом!

+1

предоставьте код, который вы пробовали самостоятельно, и ошибки, которые вы можете получить. на данный момент ваш вопрос очень широк. прочитайте http://stackoverflow.com/help/how-to-ask и http://stackoverflow.com/help/mcve, чтобы задать более интересные вопросы. – davejal

+0

@ davejal. Вы даже прочитали вопрос? Разве это не вопрос кода, который я пытался, или ошибок, которые я получил? Я не чувствую, что мой вопрос широк, это довольно прямо для меня.Но спасибо за нисходящее голосование в любом случае, – Eric

+0

1-й вопрос начинается с наилучшего пути (что приводит к ответам на основе мнения), а не хороший способ начать свой вопрос. Во-вторых, вы просите простое решение (класс, учебник или что-то еще) без предоставления кода, который вы сами пробовали. Извините, но это заслуживает более 1-го вниз. Я просто пытался помочь вам задать лучший вопрос. – davejal

ответ

0

Существует также что-то не так с решениями, которые я предоставил в ссылке моего первоначального вопроса и в другом решении, которое я получил. Рассмотрим это: #include

class A { 
    friend void foo(int); 
    static int dummy; 
public: 
    static const int &T; 
}; 

const int &A::T = A::dummy; 
int A::dummy = 0; 

void foo(int val) { A::dummy = val; } 

int main() { 
    foo(10); 
    std::cout << A::T << std::endl; 
    foo(12); 
    std::cout << A::T << std::endl; 
} 

Программа будет собирать и записывать 10 и 12 в консоли. Wich поражает цель определителя const. Здесь const является ссылкой, а не значением. Поэтому я пришел к выводу, что во время выполнения невозможно иметь переменную static const class!

0

Если вам не нравится глобальные переменные, которые вы могли бы сделать по следующей схеме:

class A { 
    friend void foo(int); 
    static int dummy; 
public: 
    static const int &T; 
}; 

const int &A::T = A::dummy; 
int A::dummy = 0; 

void foo(int val) { A::dummy = val; } 

int main() { 
    foo(10); 
    std::cout << A::T << std::endl; 
} 

Live Demo

То есть объявить хелпер static int переменную как частное в своем классе. Сделайте друга функцией, которая изменяет значение этого помощника.

Если вы хотите инициализировать его только один раз вы можете изменить вспомогательную функцию, чтобы:

void foo(int val) { 
    static int count = 0; 
    if(!count) A::dummy = val; 
    ++count; 
} 

Live Demo

Или, если вам не нравится глобальные функции, которые вы можете сделать функцию foo показанной выше функция static членом A, как показано ниже:

class A { 
    static int dummy; 
public: 
    static const int &T; 
    static void foo(int val) { A::dummy = val; } 
}; 

const int &A::T = A::dummy; 
int A::dummy = 0; 

int main() { 
    A::foo(10); 
    std::cout << A::T << std::endl; 
} 

Live Demo

+0

Это решение работает, но не является глобальной функцией? Таким образом, это почти то же самое решение, что и в ссылке, но с глобальной функцией вместо глобальной переменной? Кстати, это не то, что мне не нравится глобальная переменная, но в том контексте, в котором я работаю, я не могу их использовать. – Eric

Смежные вопросы