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

Posted

技术标签:

【中文标题】如何使用代码初始化静态成员字符数组【英文标题】:How to initialize static member char array with code 【发布时间】:2012-06-19 01:33:52 【问题描述】:

我想根据其他静态 char 数组成员初始化一个静态 char 数组成员 - 但初始化是这样的,代码是必要的。这可能吗?

class fred 
    static char *a;
    static char *b;
    static char c[4];

现在 a 和 b 将具有固定值,但我想根据它们构造 c。 例如:

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

但是我无论如何都看不到初始化c,除了创建一个仅是char [4]的类,其构造函数引用fred :: a和fred :: b,然后替换fred 中的 c 与该类的实例 - 在引用 c char 数组时很尴尬。

有没有更好的办法?

【问题讨论】:

这里有什么理由不能使用 std::string 吗? 我不使用字符串,因为它会被大量访问,而且我假设(可能是错误的)裸字符数组具有更好的性能。 只是说明应该清楚这不是你应该做的事情。 @user1425406 永远不要将与性能相关的决策建立在假设之上,无论您认为它们多么明显。一般来说,编译器比你更擅长生成高性能代码,所以只要有可能就遵循“好的”/常见的做法,只有当你有 proven*(by a *benchmark) 时才考虑替代方案这种表现是个问题。过早的优化是......你知道的。 :) @DavidSchwartz - 你能解释一下吗?你认为我正在做的哪一部分做得不对?使用 char 数组而不是字符串? 【参考方案1】:

编辑:最初,我有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);

【讨论】:

我试过了,看起来很有效,谢谢!如果我想在 fred 中定义 wilma(这确实会更整洁一些),我不太明白你把这个类称为别的东西是什么意思。 @user1425406:太棒了,yabba dabba doo!对我提出的问题 +1。 @user1425406 他的意思只是开玩笑。如果它是类成员,则没有真正的理由或需要重命名它。 :) @user1425406:我将示例修改为在fred 中包含dino。问候 嗯,弗雷德在威尔玛里面,迪诺在弗雷德里面。如果我见过的话,双关语。【参考方案2】:

连续的字符串文字在编译时连接...

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

【讨论】:

不太好用,因为c 变成了 'a', 'b', '1', '2' 而不是"ab1"【参考方案3】:

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

在那个静态构造函数中,你可以初始化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)

希望对您有所帮助。干杯

【讨论】:

如果fred 从未被其他任何人实例化,这是一个很好的技巧。它可能至少应该检查一下它是否已经初始化。 我认为提问者可以通过本指南做到这一点。但你是完全正确的 不太明白,不是每次创建fred实例都会调用fred构造函数吗?这是不可取的..

以上是关于如何使用代码初始化静态成员字符数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在可配置计数的静态结构数组中初始化具有特定值的成员? [复制]

C++ 如何将一个静态结构体数组初始化?

方法中使用的静态模板成员数组 sizeof

C ++初始化对象的非静态成员数组

java 静态代码块 代码块 构造函数 静态成员变量 成员变量的初始化顺序

如何初始化派生类中的静态成员?