C++类声明中静态对象的初始化

13

我有一个C++类(class1),其中包含另一个类(class2)的静态对象作为私有成员。

我知道在使用程序时,我必须初始化静态对象,我可以使用默认构造函数进行此操作(不希望的值)。

是否可能仅在创建包含类(class1)的对象时初始化静态对象,并仅初始化一次,以我的所需值为准?

将不胜感激任何帮助。


你不能使用类构造函数来初始化静态成员。构造函数在每次创建对象实例时都会被调用,但静态成员只会初始化一次。 - John Dibling
1
@JohnDibling 是的,如果你添加一个检查,你就可以这样做。 - Seth Carnegie
1
在你下面的代码中,Bptr = new B(arguments, to, constructor); 不是初始化。初始化是 B* A::Bptr = nullptr; - John Dibling
@JohnDibling 啊,你说得对,术语搞错了。 - Seth Carnegie
1个回答

23
是的。
// interface

class A {

    static B b;
};

// implementation

B A::b(arguments, to, constructor); // or B A::b = something;

然而,即使您没有创建 A 类的实例,它也会被初始化。除非使用指针并在构造函数中初始化一次,否则无法以其他方式完成,但这可能是一个糟糕的设计。

如果您真的想要这样做,以下是方法:

// interface

class A {
    A() { 
        if (!Bptr)
            Bptr = new B(arguments, to, constructor);

        // ... normal code
    }

    B* Bptr;
};

// implementation

B* A::Bptr = nullptr;

不过,正如我所说的那样,这很可能是一种糟糕的设计,并且会存在多线程问题。


1
@bryansammon 嗯,这当然取决于你的情况,但我认为坏设计的情况比好设计的情况更多。我想不出任何情况下你会希望在创建这些对象之一后出现一个新的单独对象。不过最终决定权在你手中。 - Seth Carnegie
@bryansammon 实际上算了,那种方式行不通,我的错。 - Seth Carnegie
关于线程问题、对API设计的影响以及C++11的一些注释,您可能会发现这个相关问题很有趣:http://stackoverflow.com/questions/9507973/how-to-mitigate-user-facing-api-effect-of-shared-members-in-templated-classes - HostileFork says dont trust SE
你不必在构造函数中进行测试;任何工厂函数都可以。如果正在构建的对象是可变的,则不会引入任何其他线程问题;无论你做什么,都需要锁定才能访问它。(另一方面,具有静态生命周期的真正可变对象很少是一个好主意。虽然也有例外情况。) - James Kanze
从我所了解的情况来看,B 不仅仅是供 A 使用的。 - Seth Carnegie
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接