C ++ Использовать указатель там, где ожидается указатель на указатель - PullRequest
0 голосов
/ 25 июня 2011

Я хотел бы расширить базовый класс, который имеет виртуальную функцию, которая принимает указатель на массив типа.Производный класс является более сложным и может использовать преимущества нескольких указателей для массива этого типа.

derived и other показывают разные решения для решения этой проблемы, но мне не нравятся оба из них.Могу ли я что-нибудь сделать вместо этого?

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 ]

2 голосов
/ 25 июня 2011

Теоретически, если вы не хотите сохранять сам указатель, это должно сделать:

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 голос
/ 25 июня 2011

Код ничего не говорит о цели , которую вы хотите достичь, так как каждая функция почти пуста. Поэтому я не могу предложить ничего лучше, чем использовать следующее:

  • Используйте std::vector<int> там, где вы хотите использовать int*
  • Используйте std::vector<std::vector<int> > там, где вы хотите использовать int**
0 голосов
/ 25 июня 2011

Вы можете использовать переменные списки аргументов:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...