使多个指针同时为空 这是我用N个指针做的C++类。 class SomeClass { private: int* ptr1; int* ptr2; ... int* ptrn; private: // constructors, destructors, and methods };

使多个指针同时为空 这是我用N个指针做的C++类。 class SomeClass { private: int* ptr1; int* ptr2; ... int* ptrn; private: // constructors, destructors, and methods };,c++,pointers,C++,Pointers,在初始化阶段,我希望使所有这些指针都指向NULL(或者在声明指针时使其默认指向NULL),而不是这样做: void SomeClass::MakePtrNull() { ptr1 = NULL; ptr2 = NULL; ... ptrn = NULL; } 有什么简单的方法可以实现这个目标吗?我只是想知道是否有任何方法可以避免输入n行ptr=NULL;在我的职责范围内。提前谢谢 根据我目前收到的答案添加了: 不幸的是,这些指针必

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

void SomeClass::MakePtrNull()
{
        ptr1 = NULL;
        ptr2 = NULL;
        ...
        ptrn = NULL;
}
有什么简单的方法可以实现这个目标吗?我只是想知道是否有任何方法可以避免输入n行ptr=NULL;在我的职责范围内。提前谢谢

根据我目前收到的答案添加了
不幸的是,这些指针必须分开,因为它们用于不同的目的。我给指针取了这样的名字只是为了说明我要做的事情,但是每个指针都有完全不同的用途。我想我必须让它们指向NULL,就像我已经做的那样。感谢您的回答。

为什么不使用数组或向量,而不是创建n个单独命名的指针?然后,您可以在短for循环中执行调零操作。

您可以执行以下操作:

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

首先,不起作用的技术:

调用memset将整个对象设置为零是行不通的。首先,如果您的函数有一个或多个虚拟函数,那么会造成很多麻烦;其次,空指针不能保证由全零位模式表示

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

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


或者您可以使用boost::optional,它的工作原理与此类似。(虽然它不是指针专用的)

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

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

}
你也可以这样做:

ptr1 = ptr2 = ptr3 = NULL;
为此使用一个向量(因为从它的声音来看,你将来不需要编辑列表,而且你需要随机访问)。您可以这样做:

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;
    }
};
类指针列表
{
私人:
typedef std::vector IntPtrVector;
IntPtrVector m_ptrVec;
公众:
指针列表()
{
保护区(5);
对于(int i=0;i<5;i++)
m_ptrVec.push_back(空);
}
int*getPointer(int索引)
{
返回m_ptrVec[索引];
}
void setPointer(int索引,int*ptr)
{

assert(index而不是
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
};
模板
类MyPointer{
T*p;
公众:
MyPointer():p(NULL){}
MyPointer(T*o):p(o){}
运算符T*()常量{return p;}
//…以及其他传统的智能指针操作符
};
然后,在课堂上使用它:

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

private:
        // constructors, destructors, and methods
};
class-SomeClass
{
私人:
MyPointer-ptr1;
MyPointer-ptr2;
...
myptrn;
私人:
//构造函数、析构函数和方法
};

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

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

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

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

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

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


这是可行的,因为没有用户声明构造函数的类的值初始化将对其所有成员进行值初始化。指针的值初始化将创建空指针。

问题的关键是我是否可以采取一种懒惰的方法来解决这个问题。感谢您花时间讨论这些建议gh.您说空指针不保证由全零位模式表示,这是否意味着这样的if检查:if(ptr1)不是确定指针不为空的安全方法?是的,请详细说明什么情况下0x0不是有效的“此处未分配内存”地址。此外,如果结构/类(及其父类)如果没有虚拟方法,则其sizeof将正好是其成员的sizeof之和。@average。这是安全的。空ptr的计算结果必须为false,但实现可以在内存中随意表示它。实际上,几乎每个人都使用0,因为空ptr也必须将整数转换为0,这通常是最简单和最有效的方法不能更改位模式。@Shane:struct必须是POD,你所说的才能得到标准的保证。除了虚拟方法之外,还有其他一些东西可以导致struct成为非POD,而拥有任何基类就是其中之一。@Shane:没有太多要详细说明的。它通常遵循CPU体系结构。在某些机器上是的,地址0可能是一个有效地址,另一个值通常用于“null”。或者在具有分段内存模型的计算机上,使用“null”值也可能不是普通的0x0。在大多数计算机上,值0和空指针的值之间没有区别,但在C++标准环境中,为了便于移植,不能保证是这种情况。空指针不是空指针。它是一个空指针常量,即0。jalf谈论空指针,而h不是0,而是一个不指向任何对象或函数的指针。它也不会转换回0。该转换仅从0转换为空指针-但它会转换为带有false的bool。有关差异的信息,请参阅no
class SomeClass {
    struct Pointers {
        int* ptr1;
        int* ptr2;
        float* ptrn;
    } ptrs;

public:
    void MakePtrNull();
};

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