2014-10-12 5 views
-1

У меня тяжелое время с ошибкой, которая появляется. Это домашнее задание, и большая его часть включена в отдельный файл .h, поэтому я не буду публиковать весь код, чтобы сохранить неповрежденным. Вот соответствующие части:Ошибка: ожидаемое первичное выражение перед ']' токен (C++)

// В .h:

class array_list 
{ 
private: 
unsigned int * m_storage; 
// points to current position in the list 

// in documentation # marks the current position in the list 
// ie. if l={#1,2,3} the 1 is the current position in the list 
// if l={1,2,#3} the 3 is the current position in the list 
// the # is ONLY for documentation purposes 
unsigned int m_current; 
unsigned int m_size; 
unsigned int m_capacity; 

// и т.д.

// Руководство:

// Construct a new, empty list. 
// 
// Pre-conditions: 
// none 
// Post-conditions: 
// m_storage is initialized to point to an array of size INIT_SIZE 
// m_capacity is initialized to INIT_SIZE 
// m_current is set to -1 
// m_size is set to 0 

// То, что я написал :

array_list::array_list() 
{ 
int arrayOf[INIT_SIZE]; 
m_storage = arrayOf[]; /* <---THE PROBLEM LINE */ 
m_capacity = INIT_SIZE; 
m_current = -1; 
m_size = 0; 
} 

По какой-то причине я получаю ошибку th в компиляторе ожидалось первичное выражение перед маркером ']' в указанной строке. Я прошел через свои заметки и сделал несколько Googling, и действительно кажется, что это способ объявить массив и указать на него с заранее определенным указателем, нет? Может ли кто-нибудь помочь мне исправить это? Спасибо.

+1

'm_storage = (unsigned int *) arrayOf'. Почему вы чувствуете, что вам нужна эта пустая пара скобок? Это недопустимый синтаксис. И сделайте 'arrayOf' массив' unsigned int' (или 'm_storage'' '' int * '), так что вам не нужен бросок. О, и 'arrayOf' будет уничтожен, когда конструктор вернется, оставив' m_storage' висячий указатель. –

+0

Почему вы все равно создаете локальный массив? Если вы не просто m_storage = new unsigned int [INIT_SIZE]; ' –

ответ

-1

Перепишите это заявление

m_storage = arrayOf[]; 

в

m_storage = reinterpret_cast<unsigned int *>(arrayOf); 

Хотя это выглядит странно, что m_storage имеет тип unsigned int * и вы пытаетесь присвоить объект типа int * к нему.

И как hvd указал, что вы назначаете адрес локального массива члену данных m_storage. Таким образом, fun ction является неправильным в целом, потому что массив будет уничтожен после выхода из функции, и указатель будет недействительным.

+2

' m_storage' укажет на локальный массив, который будет уничтожен после завершения конструктора, поэтому это недостаточно эффективно, чтобы заставить его работать. – hvd

0
m_storage = arrayOf[]; 

Недействительный синтаксис.

m_storage = arrayOf; 

будет начиная вниз правильный путь (int [] распадается на int*), но все еще есть проблемы, потому что m_storage определяется как:

unsigned int * m_storage; 

и поэтому любые данные, на который указывает m_storage должны быть unsigned для которого требуется либо литье:

m_storage = reinterpret_cast<unsigned int *>(arrayOf); 

или (лучшее решение) вы определяете массив как массив unsigned int:

unsigned int arrayOf[INIT_SIZE]; 

Конечно, есть еще проблемы здесь.
Это потому, что вы создаете массив в стеке (функции), а затем позволяете ему выйти из области видимости, недействия указатель.
Есть снова два способа крепления этого:

Initialise буфера в объекте:

В файле заголовок (определения класса):

class array_list 
{ 
private: 
    unsigned int m_storage[INIT_SIZE]; 
    unsigned int m_current = -1; 
    unsigned int m_size  = 0; 
    unsigned int m_capacity = INIT_SIZE; 
    //... 
} 

Это устанавливает значения по умолчанию, когда array_list является построен.

Альтернативой может быть ближе к тому, что вы хотели (я не уверен на 100%) и включает в себя выделение памяти в стеке:

array_list::array_list() 
{ 
    m_storage = new unsigned int[INIT_SIZE]; 
    m_capacity = INIT_SIZE; 
    m_current = -1; 
    m_size = 0; 
} 

Просто иметь в виду, что вам нужно, чтобы написать деструктор класс сейчас, используя delete[] для unalocate в new «d память:

array_list::~array_list() 
{ 
    delete[] m_storage; 
} 

и если вы сделаете это, вы должны пройти весь путь и реализовать rule of three (or five).

Смежные вопросы