如何在c ++中检查无效/未初始化的对象

Jas*_*son 1 c++ error-handling initialization

目前,我已经创建了一个简单的错误处理系统,通过检查nullptr来检查指针是否有效:

        inline void ErrReport(const char8* fileOfError, int32 lineNumberOfError, const Blz::string c_errMessage)
        {
            ErrorContext::LogContext();
            LOG("  ERROR: %s\n", c_errMessage.c_str());
            LOG("  In %s: %i\n\n", fileOfError, lineNumberOfError);
            exit(0);
        }

        #if(_DEBUG)
            #define ERRASSERT(test, msg) do {if (!(test)) Blz::Err::ErrReport(__FILE__, __LINE__, msg);} while (0)
        #endif
Run Code Online (Sandbox Code Playgroud)

然后,我可以在我的代码中调用ERRASSERT,如下所示:

unsgined char* imageData = LoadImage("PathToImage");
ERRASSERT(imageData, "Image did not load properly");
Run Code Online (Sandbox Code Playgroud)

现在,为了与非指针对象做类似的事情,我有一个Check()函数来查看对象是否已经初始化:

        template<typename T> inline bool Check(boost::outcome::expected<T>& obj)
        {
            if (obj)
                return true;
            else
                return false;
        }
Run Code Online (Sandbox Code Playgroud)

使用此代码,如果我理解如何正确使用outcome :: expected,那么我只需在我的ERRASSERT中调用上面的函数,一切都应该同样工作

boost::outcome::expected<ObjectType> obj = functionReturnsObj(); 
ERRASSERT(Check(obj), "Object not initialized!);
Run Code Online (Sandbox Code Playgroud)

我的问题:

是否有更好的方法来检查对象是否初始化而不必将所有内容都包装在boost :: outcome :: expected中?是否存在很多场景,如果C++在创建时自动初始化对象,则不会初始化对象?我是否应该为此担心?

Lig*_*ica 5

有没有更好的方法来检查对象是否已初始化

别.

是否存在很多场景,如果C++在创建时自动初始化对象,则不会初始化对象?

是的,它没有(总是).

但这是程序员的责任(你通常可以依靠编译器警告来捕捉愚蠢的错误).

我是否应该为此担心?

没有.