在 main 中初始化类的 "static const" 类型变量成员的更好方法

Better way to initialize a "static const"-type variable member of a class in the main

本文关键字:类型变量 成员 更好 方法 const static 初始化 main      更新时间:2023-10-16

我有一个类需要一个静态常量变量成员。该类的值将在运行时由用户输入知道。我读了很多文章,但到目前为止,没有一个解决方案有效。我知道这个帖子:

我可以在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类变量!

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

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

如果您不喜欢全局变量,可以使用以下方案:

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

实时演示

也就是在类中将一个helper static int变量声明为private。将一个函数交给一个友元,该函数会更改该辅助对象的值。

如果你只想初始化一次,你可以将助手函数更改为:

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

实时演示

或者,如果您不喜欢全局函数,可以将上面显示的foo函数设置为Astatic成员函数,如下所示:

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

实时演示

我在原始问题的链接和我得到的其他解决方案中提供的解决方案也有问题。考虑一下:#包括

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类变量!