在 main 中初始化类的 "static const" 类型变量成员的更好方法
Better way to initialize a "static const"-type variable member of a class in the main
我有一个类需要一个静态常量变量成员。该类的值将在运行时由用户输入知道。我读了很多文章,但到目前为止,没有一个解决方案有效。我知道这个帖子:
我可以在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
函数设置为A
的static
成员函数,如下所示:
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类变量!
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在 C++ 中用派生类型重写成员函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 指针类型类成员的动态强制转换的恒定性是什么?
- C++预处理会生成变量成员、资源库和映射
- 实例化多种类型的成员函数模板
- 我可以使用在类构造函数中初始化的流类型的成员变量吗?
- 指针数据类型变量如何包含对象?
- [[no_unique_address]] 和两个相同类型的成员值
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 为什么我不能有指向对象的指针,这些对象的指针类型与成员变量相同?
- 有没有办法使用显式实例化按类型设置成员变量
- C++11 引用类型的成员变量,向量push_back后的不同行为
- 如何初始化类类型变量的成员数组
- 将变量指向来自不同类类型的成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- 非模板类中任意类型的c++成员变量
- 基类中基类子类型的成员变量
- 在c++中建模变量成员类型