如果不满足构造函数中的某些条件,是否可以导致新的C++类实例失败?

Jim*_*ell 5 c++ class

据我所知,当在C++中实例化一个新类时,如果内存不足,则返回指向新类的指针,或返回NULL.我正在编写一个初始化构造函数中的链表的类.如果在初始化列表时出错,我希望类实例化器返回NULL.

例如:

MyClass * pRags = new MyClass;

如果MyClass构造函数中的链表无法正确初始化,我希望pRags等于NULL.我知道我可以使用标志和额外的检查来做到这一点,但我想尽可能避免这种情况.
有谁知道这样做的方法?

Uri*_*Uri 16

这里常见的方法是抛出异常(并在更高的位置处理它).

异常机制的一个好处是它允许您从类构造函数中抛出异常.在这种情况下,您永远不会到达指针返回无效的情况.您将在相应的catch块中"获得控制权".如果指针仅在try块中声明(或者在try块调用的其他方法中),则它将在该catch块的范围之外.

这不是一个黑客 - 它是非常合法的,是一种常见的编程技术.例如,如果您的类构造函数动态分配内存(例如,对于内部缓冲区)并且此分配失败,您可能希望抛出异常,因为在构造函数体的末尾您将没有有效对象.

这是一个例子(我过去10年来一直在做Java,所以下面的C++代码可能搞砸了,也许有人可以为我编辑)

// Begin C++ code written by a Java programmer... :)
class Myclass
{
   public:
      Myclass(int length)
      {
          if(length<=0) throw BadBufferSizeException("Bla bla bla");         
          this->buffer = (char*)malloc(length*sizeof(char)); // don't remember the new syntax
      }

      void doSomething()
      {
          // Code for placing stuff in the buffer
      }
    private:
      char* buffer;
};


int main()
{
   try
   { 
     int len;
     len = getLengthFromUser();
     MyClass* pMyClass = new MyClass(len);
     myClass->doSomething();
    } catch(const Exception & e)
    {
       // Whatever... Note how pMyClass is not even accessible here
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在try块之外将pMyclass定义为null,然后在创建类时仅在try块中重新分配它,则在失败的情况下您可能仍然具有null,但是您永远不会执行doSomething() .如果您担心初始化,您也可以将doSomething()调用移到try-catch块之外,但是您需要确保指针不为null.

还要注意,与其他语言相比,C++在抛出内容时会给你更多(太多?)的自由.我通常喜欢拥有异常类的层次结构或使用具有这种层次结构的现有库.