更好地初始化主

时间:2015-12-06 00:31:29

标签: c++ static initialization const execution-time

我有一个需要静态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。这违背了const限定词的目的。这里的const是引用而不是值。所以我得出的结论是,在执行时不可能有一个静态的const类变量!

我知道另一种涉及创建设置类类的方法,但它不是很整洁。

因此,如果有人知道一个简单的解决方案,请告诉我们!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。这违背了const限定词的目的。这里的const是引用而不是值。所以我得出的结论是,在执行时不可能有一个静态的const类变量!