处理类的指针数据成员的动态内存



考虑以下类

 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;
};

最新更新