C++ 如何用代码初始化静态成员字符数组

C++ 如何用代码初始化静态成员字符数组,c++,C++,我希望使用其他静态字符数组成员对静态字符数组成员进行初始化,但是初始化是必需的。这可能吗 class fred { static char *a; static char *b; static char c[4]; } 现在a和b有固定的值,但我想用它们来构造c。 例如: 然而,我看不到初始化c的方法,除了用引用fred::a和fred::b的构造函数创建一个仅为字符[4]的类,然后用该类的实例替换fred中的c,这在引用c字符数组时是很尴尬的 有更好的方法吗?在编译时

我希望使用其他静态字符数组成员对静态字符数组成员进行初始化,但是初始化是必需的。这可能吗

class fred {
    static char *a;
    static char *b;
    static char c[4];
}
现在a和b有固定的值,但我想用它们来构造c。 例如:

然而,我看不到初始化c的方法,除了用引用fred::a和fred::b的构造函数创建一个仅为字符[4]的类,然后用该类的实例替换fred中的c,这在引用c字符数组时是很尴尬的


有更好的方法吗?

在编译时将consequentive字符串文本连接起来

#define A "1234"
#define B "ab"
fred::a = A;
fred::b = B;    
fred::c = A B;

您不能以干净的方式,但可以使用一个技巧来模拟静态构造函数,如图所示

在该静态构造函数中,可以初始化
c
。 这将是一种可能的实施方式:

class fred {
    static char *a = "1234";
    static char *b = "ab";
    static char c[4];
    public:
    fred(){
       strcpy(fred::c, fred::b);
       strncat(fred::c, fred::a, 1);
    }    
}

class Fred_staticInitializer{  
    static fred staticInitializer;  //This does the trick (launches constructor)
}

希望能有帮助。干杯

编辑:最初,我有
wilma
作为
fred
的朋友,还有一个
wilma
的静态实例进行初始化。我已经将示例更改为在
fred
中声明
dino
,因为OP说他认为这样会更干净

您可以在
fred
中创建一个类的静态实例,该类的任务是为您初始化
c

class fred {
    static char *a;
    static char *b;
    static char c[4];
    static struct dino { dino (); } dino_flintstone;
};

char *fred::a;
char *fred::b;
char fred::c[4];
fred::dino fred::dino_flintstone;

fred::dino::dino () {
    fred::a = "1234";
    fred::b = "ab";
    strcpy(fred::c, fred::b);
    strncat(fred::c, fred::a, 1);
}

这里不能使用std::string有什么真正好的理由吗?我不使用string,因为它会被大量访问,我假设(可能是错误的)使用的裸字符数组具有更好的性能。只要说明这一点,就应该清楚这不是您应该做的事情。@user1425406永远不要将性能相关的决策建立在假设的基础上,无论您认为这些假设多么明显。一般来说,编译器在生成高性能代码方面比你擅长,因此只要有可能就遵循“好”/通用的做法,并且只要你已经证明了(通过A*基准)性能是一个问题,就只能考虑替代方案。过早优化是。。。。你知道这是怎么回事@戴维施瓦茨-你能解释一下吗?我在做什么你认为我做得不对吗?使用字符数组而不是字符串?不太管用,因为
c
变成了
{'a','b','1','2'}
,而不是
“ab1”
。如果
fred
从未被其他人实例化过,这是一个很好的技巧。它可能至少应该有一个检查,看看它是否已经初始化。我认为asker可以用这个准则来做这件事。但是你完全正确我不太明白,每次我创建一个fred实例时,fred构造函数不是都会被调用吗?这是不可取的…我试过这个,它看起来很有效,谢谢!如果我想在fred里面定义wilma(这确实有点整洁),我不太明白你称这个类为别的什么意思。@user1425406:太好了,yabba dabba doo+关于我提出的问题,他只是开玩笑。如果它是类成员,则没有真正的理由或需要重命名它。:)@user1425406:我修改了示例,使其在
fred
中包含
dino
。雷加嘘,弗雷德在威尔玛里面,迪诺在弗雷德里面。如果我见过的话,我会加倍努力。
class fred {
    static char *a;
    static char *b;
    static char c[4];
    static struct dino { dino (); } dino_flintstone;
};

char *fred::a;
char *fred::b;
char fred::c[4];
fred::dino fred::dino_flintstone;

fred::dino::dino () {
    fred::a = "1234";
    fred::b = "ab";
    strcpy(fred::c, fred::b);
    strncat(fred::c, fred::a, 1);
}