【问题标题】:How can you force programmers to not initialise empty objects? [closed]你怎么能强迫程序员不初始化空对象呢? [关闭]
【发布时间】:2014-12-02 12:33:01
【问题描述】:

如果我想强制其他程序员不要在我的自定义类中初始化空对象,我该怎么做才能做到这一点?

我猜它与构造函数有关,但我不是 100% 确定。

【问题讨论】:

  • 这个问题很模糊......你能给出一个你想要避免的行为的代码示例吗?
  • 什么是空对象?
  • 我猜你要么确实想要未初始化的成员变量,要么想要未初始化的成员变量。从你的问题来看,还不清楚。
  • 最好在The Workplace发帖?
  • @sashoalm:不,作为图书馆作者,这样的事情可能是有效的问题。然后那些程序员是你的客户,而不是你的同事。

标签: c++ object constructor initialization


【解决方案1】:

在 C++11 及以后的版本中,您可以delete 默认构造函数。如果您的班级名为Foo,请使用

Foo() = delete;

不过,您需要提供另一种构造对象的方法。 (提供替代构造函数会隐式删除默认构造函数,但明确这一点可以使您的代码更清晰)。

(在 C++11 之前,您可以将默认构造函数声明为 private 并且不提供定义。尝试使用它会导致编译器和链接器错误。)

【讨论】:

  • 无论何时显式定义 any 构造函数,都不再隐式定义默认构造函数(一直如此)。无需显式删除默认构造函数。
  • @MarcvanLeeuwen,没错,但这是记录您故意这样做的好方法。
  • 确实如此。我在回答中指出了这一点。
  • 私有未定义的默认 ctor 在 C++98 中是个坏主意。正如 Marc van Leeuwen 正确指出的那样,如果您甚至没有声明它,错误总是会在编译时被捕获。通过声明它,您将定义错误延迟到链接时间。
【解决方案2】:

如果你想要一个带有未初始化成员变量的对象(这就是我解释“空对象”的方式),那么你应该构建一个构造函数来强制这些成员为空。

class Bar
{
    int* mem1;        
    int* mem2;

    Bar()
    {
        mem1=nullptr;
        mem2=nullptr;
    }
}

【讨论】:

  • 你的意思是nullptr (C++11) 或NULL (C++98) 不是null
  • @BasileStarynkevitch:已更正。
【解决方案3】:

如果 empty,您的意思是在对象创建期间不传递任何参数, 然后让你的构造函数接受一个特定的值(没有任何默认值)

【讨论】:

    【解决方案4】:

    可以通过使用单例模式的变体来限制对象实例化的数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多