C++ C++;:阻止类初始化

C++ C++;:阻止类初始化,c++,C++,我有一个类,在类构造函数中,我想检查已传递的几个参数,如果任何参数未通过检查,我想阻止初始化该类。我该怎么做 Class MyClass { MyClass(int no); }; MyClass::MyClass(int no) { if(no<0) // Prevent the Class from Initialisation } void main() { MyClass myobj(-1); // How to check if myobj

我有一个类,在类构造函数中,我想检查已传递的几个参数,如果任何参数未通过检查,我想阻止初始化该类。我该怎么做

Class MyClass
{
 MyClass(int no);
};
MyClass::MyClass(int no)
{
  if(no<0) // Prevent the Class from Initialisation
}

void main()
{
       MyClass myobj(-1);

       // How to check if myobj is an objecT???
       //  if(myobj!=null) ???
 }
Class-MyClass
{
MyClass(国际编号);
};
MyClass::MyClass(整数编号)
{

if(no)抛出异常。

抛出异常。

在您的特定情况下:采用
无符号int


一般情况下:抛出异常。

在您的特定情况下:获取一个
无符号int


一般来说:抛出异常。

您可以使类具有一个私有构造函数和一个名为“getInstance”的公共函数。当您调用getInstance时,它会进行检查,如果检查不正确,则返回null。如果检查正常,并且您希望实例化该类,则getInstance将创建并返回一个新实例。

您可以使您的类具有一个私有构造函数和一个名为“getInstance”的公共函数。当您调用getInstance时,它会进行检查,如果检查不正确,则返回null。如果检查正常,并且您希望实例化该类,则getInstance将创建并返回一个新实例。

如果我们提到所有可能的情况:

通过允许zombi对象,用户不应该对它们做任何事情,除非他调用了一个函数,如
is_good
,并发现它返回true:

Class MyClass
{
public:
  MyClass(int no);
  bool is_good() const { return good; }
private:
  bool good;
};

MyClass::MyClass(int no): good(no >= 0)
{
}

int main()
{
  MyClass m(100);
  if (m.is_good()) {
   //Go ahead and use it
  }
}
从技术上讲,可以添加运行时检查,以确保实例未被使用,除非调用了
is\u good()
,并返回true

这就是iostreams所采取的方法

有些人还会提到构造函数的参数(变得越来越奇怪):

我个人觉得这有点太尴尬了


这两者都不能阻止实例的创建。只有抛出异常才能真正中止对象构造,因此它永远不会完成。

如果我们提到所有可能性:

通过允许zombi对象,用户不应该对它们做任何事情,除非他调用了一个函数,如
is_good
,并发现它返回true:

Class MyClass
{
public:
  MyClass(int no);
  bool is_good() const { return good; }
private:
  bool good;
};

MyClass::MyClass(int no): good(no >= 0)
{
}

int main()
{
  MyClass m(100);
  if (m.is_good()) {
   //Go ahead and use it
  }
}
从技术上讲,可以添加运行时检查,以确保实例未被使用,除非调用了
is\u good()
,并返回true

这就是iostreams所采取的方法

有些人还会提到构造函数的参数(变得越来越奇怪):

我个人觉得这有点太尴尬了


这两种方法都不能阻止实例的创建。只有抛出异常才能真正中止对象构造,因此它永远不会完成。

这确实取决于您正在做什么以及为什么要这样做。您可能会发现,您的检查过程实际上最好在单独的类中完成。无论如何,以下是一些建议:

  • 如前所述引发异常。但需要确保所有调用代码都是异常安全的
  • 使用
    init()
    函数进行实际初始化。如果您有许多构造函数或想要调用纯虚拟函数,这很有用,但除了允许您分阶段构造代码(即,您可以避免调用
    init())之外,这没有多大帮助
    如果早期检查失败并将对象标记为无效
  • 如果不满足检查,您可以使用placement new并尽早退出,尽管这些检查显然在构造函数之外

就像我说的,这完全取决于你想做什么。

这确实取决于你在做什么以及为什么。你可能会发现你的检查过程实际上最好在单独的课堂上完成。无论如何,这里有一些建议:

  • 如前所述引发异常。但需要确保所有调用代码都是异常安全的
  • 使用
    init()
    函数进行实际初始化。如果您有许多构造函数或想要调用纯虚拟函数,这很有用,但除了允许您分阶段构造代码(即,您可以避免调用
    init())之外,这没有多大帮助
    如果早期检查失败并将对象标记为无效
  • 如果不满足检查,您可以使用placement new并尽早退出,尽管这些检查显然在构造函数之外

就像我说的,这一切都取决于你想做什么。

这比签入构造函数好多少?它避免了异常的开销…在这种情况下,以动态分配和内存管理为代价,并且必须检查结果。这比签入构造函数好多少?它避免了异常的开销…在这种情况下,以动态分配和内存管理以及检查结果为代价。哦,好吧,我错过了显而易见的。谢谢。哦,好吧,我错过了显而易见的。谢谢。