2013-04-26 2 views
-1

У меня есть этот код, который, как мне кажется, получил элемент под названием Vehicle, и он должен хранить его в массиве с именем Node. Это код, связанный с этой частью программы:C++ хранить элементы в массиве

void Table::process(Vehicle v, int cont) { 
    char a='A'+cont; 
    putVehicle(a,v); 
    Node.a_v[cont]=v; 
    if(cont==0) a_surt=v.rowVehicle(); 
} 

Это как у меня есть массив на частную части Table.h:

struct Node{ 
    Vehicle a_v; 
}; 

Я получаю ошибка является:

error: expected primary-expression before '.' token 

У меня есть необходимые элементы, но каждый раз, когда я набираю это: Node.a_v Это дает мне эту ошибку. Любые советы?

+4

'Узел' - это не массив, это даже не переменная, это тип. Вы можете * использовать * тип для * объявлять * массив или переменную, но сам по себе тип не является массивом или переменной. Вам нужно понять эти понятия. – john

ответ

3

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

Node.a_v[cont]=v; 

Неверный вариант. Вы должны сделать что-то вроде этого:

Node n; 
n.a_v[cont]=v; 
+0

Как это сделать? –

+1

Но 'a_v' не является массивом. –

+1

Если имя массива - Node, то 'Node [cont] .a_v' Также это довольно плохой выбор имени массива. – derpface

4

Если вы хотите использовать на структуру, вам нужно объявить Node перед его использованием. Кроме того, структура должна содержать массив (или лучше, посмотрите на vectors для большей гибкости).

struct Node { 
    Vehicle[10] a_v; // 10 is max number of Vehicles in array 
}; 

Node myNode; 
myNode.a_v[cont] = v; 

Помните, что если вы хотите сохранить эту Node вокруг и положить больше вещей в нем, он должен быть объявлен в нужном объеме. Например, чтобы ваша process функция добавления Vehicle к Node, которая существует вне функции process, вы могли бы что-то вроде этого:

void Table::process(Node n, Vehicle v, int cont) { 
    char a = 'A'+cont; 
    putVehicle(a,v); 
    if (cont < 10) { 
     n.a_v[cont] = v; 
    } 
    if (cont == 0) a_surt = v.rowVehicle(); 
} 

Это вид выглядит как вы просто пытаетесь использовать массив. В этом случае вы ищете что-то вроде этого:

// This would go somewhere in your program. Again, 10 is just an example. 
Vehicle vehicleArray[10]; 

// Send this array to this function 
void Table::process(Vehicle[] vArray, Vehicle v, int cont) { 
    char a = 'A'+cont; 
    putVehicle(a,v); 
    if (cont < 10) { // In a real program, don't hard-code array limits. 
     vArray[cont] = v; 
    } 
    if (cont == 0) a_surt = v.rowVehicle(); 
} 
2

каждый раз я печатаю это: Node.a_v Это дает мне эту ошибку.

Node - тип; типы определяют структуру объектов, но у них нет собственных полей (кроме полей static, которые относятся ко всем экземплярам одновременно, к ним обращаются по-разному).

Для того, чтобы использовать . или -> оператора а, вам нужен экземпляр в виде Node, как это:

Node x; 
x.a_v = ... 

Не ясно, в вашем случае, откуда Node экземпляры должны быть приходить, хоть. Чтобы получить к ним доступ, вам нужно либо передать их в качестве параметров, либо сделать их доступными статически/глобально (не рекомендуется).

0

Итак, Node НЕ является именем вашего массива. Это имя определенного пользователем типа, который должен содержать массив. Однако ваш узел не содержит массив.Он содержит одно транспортное средство с именем a_v. Я предполагаю, что a_v должен представлять собой Массив транспортных средств. Поэтому вам нужно выделить массив. Что-то вроде этого:

struct Node { 
    Vehicle a_v[AMOUNT]; 
}; 

Если вы не знаете, во время компиляции, как большой Вы хотите, чтобы ваши массивы быть, то они должны быть динамически распределяемой, например:

struct Node { 
    Vehicle* a_v; 
    Node() { 
     a_v = new Vehicle[AMOUNT]; 
    } 
}; 

Если это динамически выделено, то оно также должно быть высвобождено:

struct Node { 
    Vehicle* a_v; 
    Node() { 
     a_v = new Vehicle[AMOUNT]; 
    } 
    ~Node() { 
     delete[] a_v; 
    } 
}; 

и если она выделяется динамически, вам необходимо добавить положения для копирования или отключить копирование:

struct Node { 
    Vehicle* a_v; 
    Node() { 
     a_v = new Vehicle[AMOUNT]; 
    } 
    ~Node() { 
     delete[] a_v; 
    } 

    // Disable copies (with C++11 support): 
    Node(const Node&) = delete; 
    Node& operator=(const Node&) = delete; 

    // Disable copies (without C++11 support) by making them private and not defining them. 
    private: 
    Node(const Node&); 
    Node& operator=(const Node&); 
}; 

Тогда получить доступ к одному из автомобилей, Вы должны были бы сделать так, как это:

Node n; // Declare a node, which contains an array of Vehicles 
n.a_v[cont] = v; // Copy a Vehicle into the array of Vehicles 

Заметим, однако, что если объявить экземпляр узла в этой функции, то она является локальной и он исчезнет из сферы действия, как только ваша функция закончится. Вам нужно объявить экземпляр Node в качестве члена вашей таблицы, если вы хотите, чтобы он продолжал проходить вызов функции.

class Table 
{ 
    private: 
     Node n; 
}; 

Наконец, как и другие, я настоятельно рекомендую вам прочитать книгу на C++ для изучения C++. Мои личные рекомендации: this book (5-е издание, не покупайте 6-й или 7-й - автор этих изданий ужасен).

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