arrayList <string>проблема - PullRequest
       1

arrayList <string>проблема

1 голос
/ 02 февраля 2011

Вот класс arrayList:

template<class T>
class arrayList: public linearList<T> 
{

public:
    // constructor, copy constructor and destructor
    arrayList(int initialCapacity = 10);
    arrayList(const arrayList<T>&);
    ~arrayList() {
        delete[] element;
    }

void insert(int theIndex, const T& theElement);
protected:
    T* position;
}; // end of iterator class

protected:
    // additional members of arrayList
    void checkIndex(int theIndex) const;
    // throw illegalIndex if theIndex invalid
    T* element; // 1D array to hold list elements
    int arrayLength; // capacity of the 1D array
    int listSize; // number of elements in list
};

dict2 читает файл и сохраняет слова в arrayList. Я использую rrayList<char[10]>, но как ввести их в arrayList из файла? Ошибки указаны в приведенной выше функции main ().

А в основном:

В основной функции оно имеет следующее.

arrayList<char[10]> *dict1 = new arrayList<char[10]> (1000);

int k = 0;
while (getline(fin, str)) {
    dict1->insert(k, str.c_str()); // error here
    k++;
}

reverseArray(dict2); // error here

Редактировать

Я должен использовать arrayList<string> в этом случае.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Ваша insert функция объявлена ​​как

void insert(int theIndex, const T& theElement); 

T - это char[10], поэтому вам нужно передать его char[10], а не const char*.

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

1 голос
/ 02 февраля 2011

Вы должны попытаться использовать std::string как содержащийся тип. Хотя это немного фрагментирует память, это сделает код более простым и менее подверженным ошибкам. Как таковой, он не сможет обрабатывать слова, которые занимают более 10 символов (или 9 плюс терминатор nul, если вы хотите сделать слова совместимыми со строками C), и вам придется искать способ ручного копирования содержимого из std::string, который вы прочитали с getline в массив, и это сделает код немного неловким:

while ( getline( fin, str ) ) {
   char buffer[10];
   strncpy( buffer, str.c_str(), 10 ); // manually copy
   dict1->insert( k, buffer );
   dict2->insert( k, buffer );
   ++k;
}

Если бы контейнер содержал строки вместо символьных массивов фиксированного размера, код был бы немного проще:

while ( getline( fin, str ) ) {
   dict1->insert( k, str );
   dict2->insert( k, str );
   ++k;
}

и гораздо более гибкий, так как он сможет обработать этот ответ независимо от длины самых длинных слов (совместимо: 10, независимо: 10).

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