考虑以下类
class A
{
ClassF1 *ptrobjF1;
ClassF2 *ptrobjF2;
ClassF3 *ptrobjF3;
A()
{
ptrobjF1 = NULL;
ptrobjF2 = NULL;
ptrobjF3 = NULL;
}
};
在上面的类 A 中,我有三个指针数据成员,用于类 F1、类 F2 和类 F3。将在需要时为此类分配内存。可能出现的情况是,只需要创建 ptrobjF1 的内存(或者)可能需要创建所有三个成员的内存。
由于所有三个指针都是公共的,因此使用该类的最终用户将访问它。
假设我正在为类中的一个数据成员(ptrobjF1)创建内存,并将其他两个数据成员保留为 NULL。在这种奇怪的情况下,如果任何机构访问类外的数据成员,如下所示
A obja;
(obja.ptrobjF3)->Some_function(); // Program crahses because dereferncing NULL
是否有任何设计模式可以避免访问未初始化的数据成员?
您可以使用例外
class WrongAccess
{};
class A
{
private:
ClassF1 *ptrobjF1;
public:
ClassF1* getF1()
{
if( ptrobjF1 )
{
return ptrobjF1;
}
else
{
throw WrongAccess();
}
}
A( )
{
ptrobjF1 = NULL;
}
};
A obja;
//Do something
...
try{
obja.getF1()->SomeFunc();
}
catch(WrongAccess &e)
{
///some handling
...
}
你最好使指针成为私有成员,然后通过getter函数控制它们的分配。对此的概述:
class A
{
public:
ClassF1& getF1()
{
if (!ptrobjF1)
{
ptrobjF1 = new ClassF1{};
}
return *ptrobjF1;
}
A() : ptrobjF1{nullptr} {}
~A()
{
delete ptrobjF1;
}
private:
ClassF1 *ptrobjF1;
};
当然,您还应该在分配失败时实现错误处理,考虑复制构造,需要处理的恒定正确性等。
。或者你可以(并且应该)回避一些问题,只使用std::unique_ptr
:
class A
{
public:
ClassF1& getF1()
{
if (!ptrobjF1)
{
ptrobjF1 = std::make_unique<ClassF1>();
}
return *ptrobjF1;
}
private:
std::unique_ptr<ClassF1> ptrobjF1;
};