初始化标头中声明的静态变量

时间:2015-08-03 16:58:07

标签: c++

我正在为一个公司项目改变一个大类的类实现,该项目有几个静态变量被声明为该类的私有成员。在类头中声明了许多使用这些静态变量的数组和结构。我现在需要以某种方式从我的main函数中分配静态数据成员值。我尝试通过构造函数分配静态变量,但是在构造函数调用之前声明了标头,这是不可能的。

例如,如果我有

class Data
{
private:
  static unsigned int numReadings = 10;
  static unsigned int numMeters = 4;
  unsigned int array[numMeters];
}

我想改变它,以便我可以以某种方式从我的main函数设置numReadings和numMeters,因此它将允许我的所有数组和使用numMeters和numReadings的结构正确初始化。

有没有办法在C ++中执行此操作?当然,我总是可以改变我的类设计,并在构造函数中以某种方式设置它们,但我想避免这种情况,因为它可能需要相当长的时间。

3 个答案:

答案 0 :(得分:0)

您是否尝试过公开并使用Data :: numReadings = 10?

访问它们

更新:

#include <cstdlib>

using namespace std;

/*  *   */

class Asdf
{
public:
    static int a;
};

int Asdf::a = 0;

int main(int argc, char** argv) {
    Asdf::a = 2;

    return 0;
}

答案 1 :(得分:0)

无论这些变量是否可访问,您都需要在类定义之外定义和初始化静态成员:

#!/bin/bash

#What can I add here to hide current process ($$) and to release focus ?

start_server()
{   
    #my script here with infinite loop ...
}

这是类的实现的一部分,不应该在标题中(ODR规则)。

当然,如果您想从外部访问这些变量(在类的所有实例之间共享),您需要将它们公开或更好地预见和访问。

修改:

由于围绕静态问题制定了问题,我没有注意到变量长度数组:这不是标准的c ++,尽管有些编译器可能会接受它作为非标准扩展。

要正确执行此操作,您应该定义一个向量并在构造时初始化它:

// header
class Data
{
private:
  static unsigned int numReadings;
  static unsigned int numMeters;
  unsigned int array[numMeters];  //<=see edit
}; 

// class implementation file
unsigned int Data::numReadings = 10;
unsigned int Data::numMeters = 4;

答案 2 :(得分:0)

你不能在主函数中 ,但你可以在main.cpp文件中执行:

// Main.cpp
#include <iostream>
#include "T.h"

using namespace std;

int T::a = 0xff;

int main()
{
   T t; // Prints 255

   return 0;
}

// T.h
#pragma once
#include <iostream>

using namespace std;

class T {
public:
    T() { cout << a << endl; }

private:
    static int a;
};