C ++:防止类初始化

时间:2010-01-28 18:00:47

标签: 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 is an objecT???
       //  if(myobj!=null) ???
 }

5 个答案:

答案 0 :(得分:15)

抛出异常。

答案 1 :(得分:6)

在您的具体情况下:选择unsigned int

一般情况下:抛出异常。

答案 2 :(得分:2)

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

通过允许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_good()并返回true,否则可以添加不使用实例的运行时检查。

这是iostream采取的方法。

有些人还会提到构造函数的参数(得到更奇怪和更奇怪的东西):

Class MyClass
{
public:
  MyClass(int no, bool& success);
};

MyClass::MyClass(int no, bool& success)
{
  success = no >= 0;
}

int main()
{
  bool result;
  MyClass m(10, result);
  if (result) {
    //go ahead and use m
  }
}

我个人认为这有点太尴尬了。

这些都不会阻止创建实例。只抛出异常才能真正中止对象构造,所以它永远不会完成。

答案 3 :(得分:1)

您可以让您的类具有私有构造函数,以及名为“getInstance”的公共函数。当你调用getInstance时,它会执行检查并在检查错误时返回null。如果您的检查没问题,并且您想要实例化该类,则getInstance将创建并返回一个新实例。

答案 4 :(得分:0)

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

  • 如前所述抛出异常。需要确保您的所有调用代码都是异常安全的。
  • 使用init()函数进行实际初始化。如果您有许多构造函数或者想要调用纯虚函数,这很有用,但除了允许您分阶段构造代码之外没什么用处(例如,如果您可以避免调用init()早期检查失败并将对象标记为无效。
  • 如果不满足检查,你可以提前使用新的和保释,虽然这些显然不在构造函数之内。

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