在C++中初始化类变量浮点数组

Initialize class variable float array in C++

本文关键字:数组 类变量 初始化 C++      更新时间:2023-10-16

我正在尝试初始化一个类变量数组。据我了解,正常的类变量初始化是这样的:

class test
{
public:
    static const float f;
};

但是,作为一个数组,它突然不起作用:

class test
{
public:
    static const float f[2];
};
//const float test::f = { 1 ,2};

整个代码应该可以工作,但我注释掉了第 6 行。在第 4 行,它仍然扔了

错误LNK2001未解析的外部符号"public:静态浮点常量 * 常量测试::F">

我尝试了指针和动态分配,两者都不起作用。如何修复此错误,第 6 行有问题吗?

解释

static test::f意味着f不绑定到类实例test。换句话说,只有一个单一的f就像test namespace,而不是class。只有一个而且正好有一个f.

注意

另外,您忘记添加必须在编译时给出的数组f大小。您也可以始终使用decltype说明符,该说明符将自动为您提供正确类型的成员。

基本示例

#include <iostream>
class test
{
public:
    static const float f[2];
};
decltype(test::f) test::f = {1, 2};
int main(){
    // Outputs: 1, 2
    std::cout << test::f[0] << ", " << test::f[1];
}

现代示例

更现代的解决方案将使用std::array、初始值设定项列表、auto占位符类型说明符和constexpr说明符。在这种情况下,您根本不需要提供数组大小。

#include <iostream>
#include <array>
class test
{
public:
    static constexpr auto f = std::array {1.f, 2.f};
};
int main(){
    // Outputs: 1, 2
    std::cout << test::f[0] << ", " << test::f[1];
}

正如@NathanOliver所说,您可以在类之外将大小添加到初始化中:

class test                                                                   
{                                                                            
public:                                                                      
    static const float f[2];                                                 
};                                                                           
...                                                                          
const float test::f[2] = {1, 2};

或者,您也可以使用 constexpr 并在类本身中声明数组:

class test                                                                  
{                                                                           
public:                                                                     
    static constexpr float f[2] = {1, 2};                                   
};