Почему в этом случае есть разница в расположении asterisk, но нет в других?

#c #pointers #vector

#c #указатели #вектор

Вопрос:

Я создаю вектор указателей, входящих в class Location, внутри class Location, поэтому:

 class Location //(simplified to prevent long code)
{
private:
std::string name, description;
int id;
std::vector<Item> items;

public:
Location();
~Location();

std::vector<Location*> nextLocations; //vector of pointers
};
  

Почему мой код компилируется с

 std::vector<Location*> nextLocations;
  

но не с

 std::vector<Location> *nextLocations;
  

В чем разница? Я думал

 int* i; 
  

и

 int *i;
  

были ли они одинаковыми? Разве вектор не остается вектором указателей местоположения в любом случае? Моя функция-член в классе Location, названная addLoc(), не работает, если параметр не принимает адрес местоположения, а затем выполняет push_back для nextLocations. Но когда я push_back, почему я должен использовать

 nextLocations.push_back(amp;location);
  

и не

 nextLocations->push_back(amp;location);
  

разве каждый элемент nextLocations не должен быть указателем?

Комментарии:

1. Поскольку они означают разные вещи, std::vector<Location*> nextLocations; это вектор указателей на объекты Location, std::vector<Location> *nextLocations; это указатель на вектор объектов Location. int *i и int* i то же самое, потому что это просто пробелы, в векторном случае это не так….

Ответ №1:

Да, int* i; ans int *i; — это одно и то же. Однако, например, что-то за скобками (или что-то эквивалентное) не совпадает. Итак,

 myfunc(i)   7;
  

это не то же самое, что

 myfunc(i   7);
  

Подумайте о <> подобных скобках. Таким образом:

 std::vector<Location *> nextLocations;
  

это не то же самое, что:

 std::vector<Location> *nextLocations;
  

Если вы не понимаете, в чем разница, первый — это вектор указателей местоположения. Второй — это указатель на вектор местоположений, который, опять же, не совпадает. Убедитесь, что вы выбрали правильный :