能否一类的静态成员为同一类型作为类是成员的C++

问题描述:

可以说我有能否一类的静态成员为同一类型作为类是成员的C++

class : foo 
{ 
    public: 
    static const foo Invalidfoo; 
    foo(); 
    foo(int, string); 
    private: 
    int number; 
    std::string name; 
}; 

它是安全的或容易出现什么问题?

编辑:

我想用这个有一个无效的对象返回为发动错误的引用。

这是完全合法的,但下面是更好:

class foo: 
{ 
public: 
    static const& foo Invalidfoo() 
    { 
     static foo Invalidfoo_; 
     return Invalidfoo_; 
    } 

private: 
     foo(); 
}; 

这样保证了初始化对象是首次使用这种方式。

编辑:但不管你怎么做,你仍然有一个全局对象,这可能是一个问题的原因。最好的解决方案可能是每次需要默认构造对象时调用默认构造函数。在效率方面,差别可能是可以忽略的。

这是合法的。

它实际上是广泛应用于singleton pattern

单身的多线程访问和创建问题。

这个一篇好文:

C++ and the Perils of Double-Checked Locking

它只是表现得像一个全局变量或单身。这很容易出现与这些问题有关的问题。

这是完全有效的代码。它没有任何理由导致任何问题,因为静态数据成员不会影响类的大小。无论你在一个类中定义多少个静态数据成员,它的大小都不会改变一个字节!

struct A 
{ 
    int i; 
    char c; 
}; 

struct B 
{ 
    int i; 
    char c; 
    static A a; 
    static B b; 
}; 

在上面的代码中,sizeof(A) == sizeof(B)将始终为真。看到这个演示:

其从C++标准(2003年)由部分$ 9.4.2/1支撑,

静态数据成员不的一部分 一类的子对象。有只有一个副本 类的所有对象共享的静态数据成员 。

您不能定义封装类类型的非静态数据成员,因为非静态成员是对象的部分,这样他们就有助于类的大小。由于数据成员的递归性质,它在计算类的大小时会导致问题。


请参见本主题:

这是合法的。从实用/风格的角度来看,代码很糟糕,但它是合法的,在技术上它可以工作。比Singleton更好,因为它是不可变的。

这实际上是如何实现一个单例,除了你的静态成员将是一个指针。所以是的,你很安全。