【问题标题】:Can a static member of a class as the same type as the class it is member of in C++类的静态成员是否可以与 C++ 中它所属的类具有相同的类型
【发布时间】:2011-06-15 18:13:26
【问题描述】:

假设我有

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

它是否安全或容易出现任何问题?

编辑:

我想用它来返回一个无效对象作为启动错误的引用。

【问题讨论】:

    标签: c++ class static


    【解决方案1】:

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

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

    这样可以保证对象在第一次使用时就被初始化。

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

    【讨论】:

      【解决方案2】:

      这是合法的。

      其实在singleton pattern中被广泛使用

      单例多线程访问和创建问题。

      一篇关于这个的好文章:

      C++ and the Perils of Double-Checked Locking

      【讨论】:

        【解决方案3】:

        它就像一个全局变量或单例。很容易出现与这些相关的问题。

        【讨论】:

          【解决方案4】:

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

          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 部分支持它,

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

          您不能定义封闭类类型的非静态数据成员,因为非静态成员是对象的一部分,因此它们确实会影响类的大小。由于数据成员的递归性质,在计算类的大小时会出现问题。


          看到这个话题:

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 2012-04-19
                • 2021-08-17
                • 2021-01-06
                • 1970-01-01
                • 1970-01-01
                • 2011-03-27
                • 2012-12-15
                • 1970-01-01
                相关资源
                最近更新 更多