C++ 结构中的静态常量,使用构造函数

C++ 结构中的静态常量,使用构造函数,c++,static,constructor,struct,C++,Static,Constructor,Struct,我正在寻找一种方法来初始化结构内部的静态浮点,但使用结构的构造函数。在这个网站上已经有了初始化值的解决方案,但是我找不到一个显式使用构造函数的解决方案 其思路如下: struct test { static const float a; int b; test(int bb, float a); }; test::test(int bb, float aa) { b=bb; a=aa; } int main() { int bval=2; float aval=0

我正在寻找一种方法来初始化结构内部的静态浮点,但使用结构的构造函数。在这个网站上已经有了初始化值的解决方案,但是我找不到一个显式使用构造函数的解决方案

其思路如下:

struct test {
  static const float a;
  int b;
  test(int bb, float a);
};

test::test(int bb, float aa) {
  b=bb;
  a=aa;
}

int main() {
  int bval=2;
  float aval=0.25;
  struct test aaa(bval, aval);
  return 0;
}

如何正确实施?谢谢您的建议。

静态成员与特定实例没有关联,因此它们将只初始化一次。另一方面,构造函数是在每个实例的基础上调用的,因此执行您试图执行的操作是没有意义的

另一方面,您可以像上面所做的那样,为构造函数中的静态成员分配一个新值,但是您仍然必须事先以正常方式在结构外部初始化静态成员

值得注意的是,其他语言(例如java)有一个静态构造函数的概念,用于C++的精确性,但是C++没有。 尽管如此,您可能会发现以下问题很有趣:


除了

const float test::a = something;
类外(在单个编译单元中)。但是,您可以执行您编写的操作,这将把变量设置为您传递的值

如果您只想在第一次输入构造函数时设置它,您可以(但不应该)执行以下操作

test::test(int bb, float aa){
    static float _unused = (test::a = aa);

    b=bb;
}

但这并没有初始化它,它只是给它赋值,你仍然需要每次都把变量传递给构造函数,并且什么也不做(除非你给它一个默认值或其他东西)。尽管这是一个非常糟糕的设计,但最好在类中使用
static
函数来设置变量。

您不能在构造函数中初始化静态const var

您应该在声明时初始化

static const float a = 3.1416f;
确保您理解const关键字。
应该是积分。

只有积分恒常积分才能做到这一点?这在g++静态常量float f=3.14f的情况下对我有效;那么你指的是什么呢?它是否在一个编译器上工作并不意味着什么,这是对G++的非标准扩展。它不在VisualStudio上编译(虽然这本身并不意味着什么,但VS在这方面更符合要求,并且正确)。没问题,编译器是一种卑鄙的软件,它可以愚弄你,让你在相反的情况下认为某件事是对的还是错的。我已经做了一千次了,为什么<代码>静态数据属于该类;构造函数在实例上运行。为什么每次创建新实例时都要覆盖所有实例之间共享的值?你希望完成什么?谢谢你的回答。如果您有这些测试的数组,并且希望确保在每个元素的每次操作中参数“a”保持不变,您会怎么做?每个元素的“a”也不同。我想这是一个静态常数,但显然我错了…@Fabrizio我真的不明白你的问题。如果
a
静态的
,则只会分配一次。如果
a
不是静态的,则只有要构造的第一个对象将设置其
a
。这是因为您在构造函数中使用了一个只初始化一次的
静态
变量。