проблема с указателем на указатель (AnyType ** var) в C ++ - PullRequest
0 голосов
/ 10 ноября 2010

Как вы знаете, в .NET Framework есть универсальный класс List.Я хочу написать общий класс List в C ++, и я хочу хранить указатели на тип в моем списке.это заголовок и исходный код класса и тестовой программы:

// header
template <class Type>
class List
{
public:
   List(int size);  // constructor
    .
    .
    . // other public members
private:
   Type **list; // a dynamic array of pointer to Type
    .
    .
    . // other private members 
};

// source code 
template <class Type> List<Type>::List(int size) // constructor
{
   this->list = new Type[size];
    .
    . // other parts of definition
}

// main function
void main()
{
    List<AnyType> mylist = new List<AnyType>(4);
    mylist[0] = new AnyType( // any arguments);
}

это не работает должным образом.где проблема?Можно ли использовать этот класс для Structs?

Ответы [ 5 ]

2 голосов
/ 10 ноября 2010

this->list = new Type[size]; должно быть this->list = new Type*[size];

Редактировать: он на самом деле компилировался?Назначение должно как минимум генерировать предупреждение.

1 голос
/ 10 ноября 2010

вижу как минимум две проблемы:

  • Если вы хотите выделить массив указателей для Type объектов, вы должны заменить new Type[size]; на new Type*[size];
  • Чтобы использовать этот синтаксис mylist[0] = new AnyType(/* ... */), вам необходимо перегрузить оператор [] в вашем классе

В общем, C ++ имеет довольно хорошую Стандартную библиотеку шаблонов, которая уже содержит реализации общих списков (std::list) и массивов (std::vector). См. Например эту ссылку

0 голосов
/ 10 ноября 2010

В вашем коде есть несколько проблем:

  • Строка this->list = new Type[size]; выделяет массив Type, а не массив Type *: вы можете изменить это на new Type*[size]
  • Код List<AnyType> mylist = new List<AnyType>(4); не скомпилируется.Либо используйте List<AnyType> mylist(4); или List<AnyType> *mylist = new List<AnyType>(4); (что потребует дополнительного delete перед выходом из программы)
  • Я вижу, вы отделили реализацию в исходном файле: я рекомендую вам прочитать этот пункт

Я пропускаю обычное «зачем кому-то разрабатывать свой собственный список?»и «это больше похоже на вектор, чем на список?».

0 голосов
/ 10 ноября 2010

myList не является массивом, он содержит массив.Так что либо тип должен иметь операторы типа [] (не уверен, если это возможно в C ++), либо метод, который позволяет вам установить this-> list [n] = что-то.

template <class Type> List<Type>::SetItem(int itemNumber, Type theItem ) 
{
   this->list[itemNum] = theItem;
}

, а затем позвоните

myList.SetItem(0, new AnyType(...));
0 голосов
/ 10 ноября 2010

Изменить

new Type[size];

на:

new Type*[size];

Вам нужен массив указателей, а не массив Type

И что не так с std::vector<Type*>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...