Указатель на указатель с пользовательской структурой - PullRequest
0 голосов
/ 20 мая 2011

У меня есть похожая проблема, подобная той, которая перечислена здесь указатель на указатель на структуру, вызывающую головную боль
моя проблема другая, потому что я не хочу многоэкземпляры из LISTOFONES я хочу несколько экземпляров ONE's Pointers, таких как

class ONE {  
    int id;  
    char *name;  
};

class LISTOFONES {
    ONE **pointers;
    char *name;

    LISTOFONES ();
    ~LISTOFONES ();
};  

Что нужно сделать, чтобы иметь правильную и безопасную для памяти инициализацию переменной pointers с
1- чистыми c ++ .. not stl контейнерами
2- 100% динамическое ограничение не [] ограничение массива
3- Полностью безопасная память (все указатели также безопасно указывают на действительный класс)

РЕДАКТИРОВАТЬ:
Это неДомашняя работа
и за то, что я хочу, я только хочу знать, каков метод правильной инициализации указателей в переменной 'pointers'

РЕДАКТИРОВАТЬ
Я пытаюсьПолучить список указателей (массив), на который указывает указатель указатели
Каждый указатель указывает на ONE структуру

1 Ответ

2 голосов
/ 20 мая 2011

Если бы это был я, я бы выделил массив ONE* с таким образом:

pointers = new ONE*[reserve];

Я бы устроил так, чтобы первые несколько членов массива pointers указывали на действительные ОДНЫЕ объекты.Последние оставшиеся члены будут равны нулю (необязательно, так как они никогда не будут разыменованы).

Когда мне нужно было увеличить массив, я бы назвал new с большим размером:

newPointers = new ONE*[newReserve];

и я бы скопировал все указатели из предыдущего массива в новый массив.

void
LISTOFONES::push_back(const ONE& one) {
  if(_size>=_reserve) {
    std::size_t newReserve = _reserve?(_reserve*2):1;
    ONE** newPointers = new ONE*[newReserve];
    std::copy(this->pointers, this->pointers+_size, newPointers);
    std::fill(newPointers+_size, newPointers+newReserve, (ONE*)0);
    std::swap(this->pointers, newPointers);
    _reserve = newReserve;
    delete[] newPointers;
  }
  this->pointers[_size] = new ONE(one);
  ++_size;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...