C ++使用指针指向指针的指针

时间:2011-06-25 15:04:56

标签: c++ design-patterns

我想扩展一个具有虚函数的基类,该函数接受指向类型数组的指针。派生类更复杂,可以利用多个指向该类型数组的指针。

derivedother显示处理该问题的不同解决方案,但我不喜欢它们。有什么我可以做的吗?

struct base {
    virtual void set(int* p, std::size_t n) { }
};

struct derived : base
{
    virtual void set(int* p, std::size_t n)
    {
        int** pp = new int*[1]; // must be deleted before destruction
        pp[0] = p;
        set(1, pp, n);
    }

    void set(std::size_t count, int* const* pp, std::size_t n)
    {
    }
};

struct other : base
{
    virtual void set(int* p, std::size_t n)
    {
        m_helper[0] = p;
        set(1, m_helper, n);
    }

    void set(std::size_t count, int* const* pp, std::size_t n)
    {
    }

private:
    int* m_helper[1];
};

3 个答案:

答案 0 :(得分:2)

理论上,如果您不想保存指针本身,则应执行以下操作:

virtual void set(int* p, std::size_t n)
{
    set(1, &p, n);
}

void set(std::size_t count, int* const* pp, std::size_t n)
{
}

答案 1 :(得分:1)

代码没有说明你要实现的目标,因为每个函数几乎为空。所以我建议不要比使用以下内容更好:

  • 在您想要使用std::vector<int>
  • 的地方使用int*
  • 在您想要使用std::vector<std::vector<int> >
  • 的地方使用int**

答案 2 :(得分:0)

您可以使用变量参数列表:

void set(std::size_t count, std::size_t n, ...) {
  va_list v;
  va_start(v, n);

  for (int i = 0; i < count; i++)
  {
    int* value = va_arg(vl, int*);
    // ...
  }

  va_end(v);
}