我有一个类,在类构造函数中我想检查几个已传递的参数,如果任何参数未通过检查,我想阻止该类初始化。我怎么能这样做?
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) ???
}
答案 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()
早期检查失败并将对象标记为无效。就像我说的一切都取决于你想做什么。