代码之家  ›  专栏  ›  技术社区  ›  stanigator

同时使多个指针为空

  •  6
  • stanigator  · 技术社区  · 16 年前

    这是我用N个指针做的C++类。

    class SomeClass
    {
    private:
            int* ptr1;
            int* ptr2;
            ...
            int* ptrn;
    
    private:
            // constructors, destructors, and methods
    };
    

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

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

    实现这个目标有什么简单的方法吗?我只是想知道是否有任何方法可以避免在我的函数中输入n行ptr=null。事先谢谢。

    补充 根据我目前收到的答案: 不幸的是,这些指针必须是分开的,因为它们用于不同的目的。我做了指针的名称,只是为了说明我想做什么,但是每个指针都有一个完全不同的用途。我想我必须让它们指向空值,就像我已经做的那样。谢谢你的回答。

    8 回复  |  直到 16 年前
        1
  •  6
  •   brian-brazil    16 年前

    为什么不使用数组或向量,而不创建单独命名的指针?然后你可以做一个短循环的零位。

        2
  •  11
  •   CesarB    16 年前

    而不是 int * ,创建类似智能指针的类,该类的工作方式与 INT* ,但默认构造为空:

    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 的方法中,它的作用与普通指针完全相同,并且具有完全相同的大小和性能。

        3
  •  5
  •   Salman A    16 年前

    您可以这样做:

    void SomeClass::MakePtrNull()
    {
            ptr1 = ptr2 = ptr3 = ... = ptrn = NULL;
    }
    
        4
  •  3
  •   Stack Overflow is garbage    16 年前

    首先,这项技术 工作:

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

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

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

    或者您可以使用boost::可选,它基本上是这样工作的。(尽管它不是针对指针的)

        5
  •  3
  •   Johannes Schaub - litb    16 年前

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

    class SomeClass {
        struct Pointers {
            int* ptr1;
            int* ptr2;
            float* ptrn;
        } ptrs;
    
    public:
        void MakePtrNull();
    };
    
    void SomeClass::MakePtrNull()
    {
        // clears all pointers at once
        ptrs = Pointers();
    }
    

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

        6
  •  2
  •   Alan    16 年前

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

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

    你也可以这样做:

    ptr1 = ptr2 = ptr3 = NULL;
    
        7
  •  1
  •   Remy Lebeau    16 年前

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

    struct MyPointers
    {
        int* ptr1;
        int* ptr2;
        ...
        int* ptrn;
    };
    
    class SomeClass
    {
    private:
        MyPointers ptrs;
        ...
    };
    
    void SomeClass::MakePtrNull()
    {
        memset(&ptrs, 0, sizeof(ptrs));
    }
    
        8
  •  0
  •   nlaq    16 年前

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

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

    编辑

    尽管老实说,这里充满了贫民区的味道。您确定您的问题需要此解决方案吗?如果你更详细地阐述你的具体问题,也许在另一个问题中,我相信你可以在如何更优雅地完成你想要的事情上得到更好的答案,而不是创造第二个问题。