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并尽早退出,尽管这些检查显然在构造函数之外
就像我说的,这一切都取决于你想做什么。这比签入构造函数好多少?它避免了异常的开销…在这种情况下,以动态分配和内存管理为代价,并且必须检查结果。这比签入构造函数好多少?它避免了异常的开销…在这种情况下,以动态分配和内存管理以及检查结果为代价。哦,好吧,我错过了显而易见的。谢谢。哦,好吧,我错过了显而易见的。谢谢。