2014-03-16 17 views
-1

Я пытался создать список adjancecy тогда я написал этот код:Что разница между Node * узел [100] и узел узел [100]

struct No{ 
    int atual; 
    No *prox; 
    No(int n){ 
     atual = n; 
    }  
}; 

No adj[101]; 

Но когда я пытался скомпилировать его, в произошла ошибка компиляции.

Затем я изменил эту строку No adj[101]; на это: No *adj[101]; и код скомпилирован успешно.

В чем разница между Node *no[10] и Node no[10]?

+2

Один из этих вызовов - несуществующий конструктор по умолчанию. – chris

+0

Первый (Узел * нет [10]) является объявлением массива указателей на узел, второй (Node no [10]) является объявлением массива структур узла. – rkosegi

+0

[Что такое правило по часовой стрелке/спираль] (http://c-faq.com/decl/spiral.anderson.html)? – Mahesh

ответ

0

определяет массив из 100 объектов, а No* a[100] определяет массив указателей 100. При определении массива объектов каждый объект может быть определен с использованием конструктора по умолчанию или другого конструктора, который имеет аргументы по умолчанию, чтобы действовать как конструктор по умолчанию. Поскольку вы не определили соответствующий конструктор, компилятор не может найти способ инициализации объектов в массиве. Нет такой проблемы с массивом указателей.

Вы можете исправить это, предоставив конструктор по умолчанию или изменив текущий конструктор со значением по умолчанию аргумента по умолчанию.

2

No adj[101] представляет собой массив структур No.
No *adj[101] - массив указателей на структуры No.

0

Каждый объект должен быть инициализирован в массиве. Вам нужен конструктор по умолчанию для объявления массива объектов способом, который вы заявляете.

Если конструктор по умолчанию не имеет смысла в вашем случае вы можете инициализировать каждый объект самостоятельно, таким образом, сделать Somthing как этот No adj[101] { No(1), No(2), ..., No(101)};

1

Разница заключается в том, что один объявляет массив структур, а другой объявляет массив указателей к структурам - но это не ваша проблема.

Вот простой пример, который иллюстрирует эту проблему у вас возникли:

struct foo { 
    foo(int n) { 
     // nothing 
    }  
}; 

foo obj; 

и вот сообщения об ошибках, которые я получаю от г ++:

c.cpp:7:5: error: no matching function for call to ‘foo::foo()’ 
c.cpp:7:5: note: candidates are: 
c.cpp:2:5: note: foo::foo(int) 
c.cpp:2:5: note: candidate expects 1 argument, 0 provided 
c.cpp:1:8: note: foo::foo(const foo&) 
c.cpp:1:8: note: candidate expects 1 argument, 0 provided 

Проблема заключается в том, что вы предоставили конструктор, который принимает один аргумент, но вы не предоставили конструктор, который не принимает аргументов. Определение объекта типа foo (или No) без инициализатора требует конструктора, который не принимает аргументов.

Если добавить что-то вроде:

foo() { } 

внутри определения класса, он компилируется без ошибок. Или я могу изменить объявление объекта из

foo obj; 

в

foo obj(42); 

, призывающее предоставленный конструктор.

0

как, ранее упомянутый. No * adj [101] - массив указателей. Но если вы хотите инициализировать с помощью конструктора, сделайте вот так: Node adj (101).

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