这是我使用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,因为我已经完成了。谢谢你的回答。
答案 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充满了热情。您确定您的问题需要此解决方案吗?如果你详细说明你的具体问题,或许在另一个问题上,我相信你可以更好地回答如何更优雅地完成你想做的事情 - 而不是通过创造第二个问题。