静态成员可以声明为const,但必须在声明中初始化。考虑以下用循环中的代码初始化静态数组的情况:
class A {
private:
enum { SIZE = 360 };
static double* vertices;
public:
static void staticInit();
};
double* A::vertices = new double[SIZE];
void A::staticInit() {
double a = 0, b = 0;
for (int i = 0; i < SIZE; i++, a += .01, b += .02)
vertices[i] = sin(a) + c2 * sin(b);
}
上面的代码可行。但如果目的是使顶点保持不变,那么将它声明为const将在staticInit函数上产生编译错误。
在较旧的C ++中,我会声明指针const,并在此函数中将其强制转换为非const,但是今天,编译器不会允许这样做,因为它不安全。当然,不声明指针const更不安全。
有没有干净的出路?
答案 0 :(得分:3)
创建一个返回makeVertices
的{{1}}函数,然后通过调用它来初始化std::array
值:
static
(constexpr std::size_t size = 360;
std::array<double, size> makeVertices()
{
std::array<double, size> vertices;
double a = 0, b = 0;
for (int i = 0; i < size; i++, a += .01, b += .02)
vertices[i] = sin(a) + c2 * sin(b);
return vertices;
}
和makeVertices
都可以在size
内定义。)
A
另请注意,使用class A {
private:
static std::array<double, size> vertices;
};
std::array<double, size> A::vertices = makeVertices();
代替constexpr
来表示编译时数值常量 - 这是惯用的C ++ 11。
答案 1 :(得分:2)
我不明白为什么你不能把你关心的所有const都做成。为了简化用例:
library(tidyverse)
l <- list(dataframe1, dataframe2, dataframe3, dataframe4)
l <- map(l, ~mutate_if(., is.numeric, as.character)
bind_rows(l)
您应该能够将此方案应用于静态类成员。