指针包装器类 - 表现得像原始指针一样

时间:2011-08-24 13:00:56

标签: c++ oop design-patterns

我想要一个指针包装器类,它就像一个原始指针一样,但也保存一个特殊的整数和指针(它来自的数组中的Type索引)

我设法让它的行为大致像指针一样。我知道指针比较解决方案可能不是最佳的,但这不是我的主要问题。 我希望使用2个参数(指针,indexToArr)构造包装器,除非指针为NULL - 然后我不关心indexToArr。

我正在尝试解决的问题是如何允许返回NULL就像普通指针允许的那样。 当前的解决方案使用ASSERT。但我想要一些在编译时工作的东西。具有专业模板方法精神的东西 - 只允许NULL作为参数。

当前版本:

class PtrWrapper
{
public:
    PtrWrapper(Type* ptr, int indToArr) 
        : m_ptr(ptr), m_indexToArr(indToArr){}

    //allow returning NULL, only NULL
    PtrWrapper(Type* ptr) : m_ptr(NULL), m_indexToArr(-1) {ASSERT(ptr == NULL);}

    Type* operator->() const {return m_ptr;}
    Type& operator*() const {return *m_ptr;}
    int IndexToArr() const {return m_indexToArr;}

    //for pointer comparison
    operator Type*() const {return m_ptr;}

private:
    Type* m_ptr;
    int m_indexToArr;
};

任何想法,建议?

谢谢, 利奥

2 个答案:

答案 0 :(得分:5)

template<typename Type>
class PtrWrapper
{
    typedef struct { } NotType;
public:
    Ptr() { }
    Ptr(const NotType* nullPtr) { }
    Ptr(Type* p, int index) { }
};

您可以利用文字NULL / 0可以自动转换为任何指针类型的事实。创建一个非T的类型,以及一个构造函数,它接受一个没有人会使用的类型的指针。现在,您可以明确处理PtrWrapper<T> x(NULL);

当然正如其他人所说的那样,只有在编译时知道NULL时才会起作用。

答案 1 :(得分:1)

只需创建一个没有参数的默认构造函数,将您的指针初始化为NULL,但请确保在operator*operator->中检查NULL指针。

执行以下操作:

PtrWrapper(Type* ptr) : m_ptr(ptr), m_indexToArr(0) {ASSERT(ptr != NULL);}
PtrWrapper() : m_ptr(NULL), m_indexToArr(-1) {ASSERT(ptr == NULL);}