同时使多个指针为NULL

时间:2009-06-19 23:24:30

标签: c++ pointers

这是我使用n个指针创建的C ++类。

class SomeClass
{
private:
        int* ptr1;
        int* ptr2;
        ...
        int* ptrn;

private:
        // constructors, destructors, and methods
};

在初始化阶段,我想让所有这些指针指向NULL(或者在声明时默认指针指向NULL)而不是这样做:

void SomeClass::MakePtrNull()
{
        ptr1 = NULL;
        ptr2 = NULL;
        ...
        ptrn = NULL;
}

有没有简单的方法来实现这个目标?我只是想知道是否有任何方法可以避免输入n行ptr = NULL;在我的功能。提前谢谢。

ADDED 根据我目前收到的答案: 不幸的是,这些指针必须是分开的,因为它们用于不同的目的。我将指针的名称作为这样只是为了说明我正在尝试做的事情,但每个指针都有一个完全不同的目的。我想我必须让它们指向NULL,因为我已经完成了。谢谢你的回答。

8 个答案:

答案 0 :(得分:11)

而不是int *,创建一个类似智能指针的类,其作用与int *完全相同,但默认构造为NULL:

template <typename T>
class MyPointer {
    T *p;

public:
    MyPointer() : p(NULL) { }
    MyPointer(T *o) : p(o) { }
    operator T*() const { return p; }
    // ...and the rest of the traditional smart-pointer operators
};

然后,在你的课堂上使用它:

class SomeClass
{
private:
        MyPointer<int> ptr1;
        MyPointer<int> ptr2;
        ...
        MyPointer<int> ptrn;

private:
        // constructors, destructors, and methods
};

MyPointer<int>类型的每个变量都将在SomeClass的构造函数中自动初始化,而无需任何额外的输入。如果您没有忘记或错误地实现MyPointer的任何方法,它将完全像普通指针一样,并具有完全相同的大小和性能。

答案 1 :(得分:6)

为什么不使用数组或向量而不是创建n个单独命名的指针?然后你可以在一个简短的for循环中进行归零。

答案 2 :(得分:5)

你可以这样做:

void SomeClass::MakePtrNull()
{
        ptr1 = ptr2 = ptr3 = ... = ptrn = NULL;
}

答案 3 :(得分:3)

首先,的技术:

调用memset将整个对象设置为零将不起作用。首先,如果你的函数有一个或多个虚函数会导致很多麻烦,其次,空指针不能保证用全零的位模式表示。

在您的情况下我可能会做的是将指针存储在数组或向量中。 然后,您可以使用std::fill函数将它们全部设置为NULL。 (或者,如果您愿意,可以使用循环)

当然,如果你需要经常这样做,可能值得编写一个包装类,它作为指针行为,但在默认构造函数中将其设置为NULL。

或者你可以使用boost :: optional,它的工作方式与此类似。 (虽然它不是针对指针的)

答案 4 :(得分:3)

如果您必须单独保留指针,我建议您执行以下操作(如果指针可以有不同的类型,可能最迫切需要)

class SomeClass {
    struct Pointers {
        int* ptr1;
        int* ptr2;
        float* ptrn;
    } ptrs;

public:
    void MakePtrNull();
};

void SomeClass::MakePtrNull()
{
    // clears all pointers at once
    ptrs = Pointers();
}

这确实有效,因为没有用户声明的构造函数的类的值初始化将初始化其所有成员。指针的值初始化将创建一个空指针。

答案 5 :(得分:2)

为什么不使用默认构造函数:

SomeClass::SomeClass() : ptr1(NULL), ptr2(NULL), ...
{

}

你也可以这样做:

ptr1 = ptr2 = ptr3 = NULL;

答案 6 :(得分:1)

您可以将指针放入结构中,然后在需要时将结构memset()。指针仍然是分开的,但您可以将它们作为一个单元进行定位,而不会影响您的其他类。例如:

struct MyPointers
{
    int* ptr1;
    int* ptr2;
    ...
    int* ptrn;
};

class SomeClass
{
private:
    MyPointers ptrs;
    ...
};

void SomeClass::MakePtrNull()
{
    memset(&ptrs, 0, sizeof(ptrs));
}

答案 7 :(得分:0)

为此使用向量(因为通过它的声音,您将来不需要编辑列表 - 您需要随机访问)。你可以这样做:

class PointerList
{
private:
    typedef std::vector<int*> IntPtrVector;
    IntPtrVector m_ptrVec;

public:
    PointerList()
    {
        m_ptrVec.reserve(5);
        for (int i = 0; i < 5; i++)
            m_ptrVec.push_back(NULL);
    }

    int* getPointer(int index)
    {
        return m_ptrVec[index];
    }

    void setPointer(int index, int* ptr)
    {
        assert(index <= 4);
        m_ptrVec[index] = ptr;
    }
};

修改

虽然说实话,但这对于ghettoness充满了热情。您确定您的问题需要此解决方案吗?如果你详细说明你的具体问题,或许在另一个问题上,我相信你可以更好地回答如何更优雅地完成你想做的事情 - 而不是通过创造第二个问题。