如何使用代码初始化静态成员字符数组
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构造函数吗?这是不可取的..以上是关于如何使用代码初始化静态成员字符数组的主要内容,如果未能解决你的问题,请参考以下文章
如何在可配置计数的静态结构数组中初始化具有特定值的成员? [复制]