2014-12-24 6 views
3

Попытка реализовать графики с использованием ссылки this, я столкнулся с серьезным сомнением в синтаксисе.Роль скорбей в массиве указателей в C++

/ A structure to represent an adjacency list node 
struct AdjListNode 
{ 
    int dest; 
    struct AdjListNode* next; 
}; 

// A structure to represent an adjacency liat 
struct AdjList 
{ 
    struct AdjListNode *head; // pointer to head node of list 
}; 

// A structure to represent a graph. A graph is an array of adjacency lists. 
// Size of array will be V (number of vertices in graph) 
struct Graph 
{ 
    int V; 
    struct AdjList* array; 
}; 

В упомянутом выше, он реализован в C, тогда как я реализовал его на C++. А теперь функция для создания структуры данных графа:

struct Graph* createGraph(int V) { 
    struct Graph *graph; 
    graph = new (struct Graph); 
    graph->V = V; 

    //the problem line below 
    graph->array = new (struct AdjList)[V]; 
    //initialize all the elements in the array as NULL 
    for(int i = 0; i < V ; i++) { 
    graph->array[i].head = NULL; 
    } 
    return graph; 
} 

Этот код дает ошибку: массив Bound запрещен после скобки типа-ID В то время как, если я просто удалить paranthese от проблемной линии, все работает хорошо. Почему это происходит?

EDIT:

Я знаю, как решить эту проблему. Просто нужно это сделать.

graph->array = new struct AdjList[V]; 

Вопрос WHA, является ли он неправильным?

+1

Просто удалите скобки и 'struct'. Нет смысла быть там. – David

+0

Я понимаю, что структура не требуется. Но это не делает это неправильно. Я хочу знать, почему использование parenthese здесь неверно. Я не уверен, что структура имеет к этому какое-то отношение. Но я могу ошибаться. – SLearner

+0

Просто сделайте 'graph-> array = new struct AdjList [V];'. Кстати, 'struct Graph' - относительно небольшой объект, поэтому вы можете также выделить его в стеке и вернуть его по значению. –

ответ

1

Существует два общих варианта new expression, которые позволяют скобки между ключевым словом и типом. Объекты, заключенные внутри, входят в качестве аргументов функции operator new. Они полезны

  1. Чтобы указать память вручную вместо использования функции operator new по умолчанию.
  2. Чтобы указать поведение без броска. Это удобно, если вы не хотите, чтобы новое выражение выбрасывало std::bad_alloc, когда распределение freestore прерывается.

1. Размещение нового

char* ptr = new char[sizeof(T)]; // allocate memory 
T* tptr = new(ptr) T;    // construct in allocated storage ("place") 
tptr->~T();      // destruct 

2. nothrow

auto p* = new (std::nothrow) char; 

Это не бросит, но будет установлен p в nullptr, если распределение не удается.

Вопрос: ПОЧЕМУ это неверно?

Потому что это не часть разрешенной грамматики, где может встречаться скобка; ошибка array bound forbidden after parenthesized type-id означает, что компилятор считает, что вы сделали это

T *arr = new (T) [count]; 

который является недействительным, так как для массива, вы

T *arr = new T[count]; 

т.е. типа без скобок. Здесь, как упоминалось в комментариях juanchopanza, тип T[], так что вы могли бы сделать T *arr = new (T[count]);.

2

"Возникает вопрос: почему это неправильно?"

В главе 5.3.4 на c++ language specification, довольно ясно показывает, что скобка immeadeatly после new ключевого слова preseved для размещение выражения:

enter image description here