Разыменование указателя на структуру в C ++ - PullRequest
0 голосов
/ 07 марта 2019

Я новичок в C ++ и пытаюсь выяснить, как разыменовать указатель на структуру, чтобы я мог получить значения членов в этой структуре. В buildCar () я хотел бы иметь возможность печатать год автомобиля, а также спецификации автомобиля (который при установке будет указателем на другую структуру). Я могу распечатать адрес памяти, где хранится структура car1, но у меня возникают проблемы с определением правильного синтаксиса, который будет использоваться для удаления этого указателя. Я пытался использовать (*) для разыменования и -> вместо. ссылаться на членов структуры, но пока не повезло. Любая помощь приветствуется. Спасибо!

struct item {
  int id;
  void *myData;
};

 struct car {
  unsigned int year;
  char* specs;
};

void buildCar(item item1);

int main() {
  struct item item1;
  item1.id = 1;
  struct car car1;
  car1.year = 2019;
  item1.myData = &car1;
  buildCar(item1);
}


void buildCar(item item1){
cout << "address of car1  = " << item1.myData;
}

Ответы [ 2 ]

3 голосов
/ 07 марта 2019

У меня проблемы с определением правильного синтаксиса, который будет использоваться для определения значения этого указателя.

Невозможно выполнить косвенный указатель через пустой указатель.Вы можете выполнять косвенные операции только через не пустые указатели.

Решение. Измените тип указателя:

struct item {
    int id;
    struct car *myData;
};

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

Предположительно, могут быть и другие типы предметов, кроме автомобилей, поэтому может потребоваться пустота *.

В чистом C ++ есть лучшие альтернативытакие как наследование, std::variant и std::any, в зависимости от требований использования.

Учитывая, что Манго упомянул в комментарии, что заголовок - C, лучшие альтернативы могут быть недоступны, и void* может бытьдействительно необходимо.

В этом случае указатель void может быть преобразован обратно в исходный тип указателя, из которого указатель void был преобразован с использованием static_cast.Поведение при преобразовании в неправильный тип будет неопределенным, поэтому следует соблюдать особую осторожность.

0 голосов
/ 07 марта 2019

Итак, давайте начнем с одного из основ: в C ++ структуры - это классы, которые по умолчанию являются открытыми.

То, что у вас выглядит как C, так что я собираюсь предположить, что это ваш базовый язык.

Это означает, что у вас есть доступ ко всей широте поведенческой конфигурации класса в структуре.

Таким образом, вы можете переписать ее примерно так:

struct Car {
    unsigned int year;
    char* specs;

    Car(int year) : year(year) {} //Constructor
};

struct Item {
    int id;
    Car *myData;

    Item(int id, Car* car) : id(id), myData(car) {} // Constructor
    ~Item() { delete myData; } // Destructor. This prevents a potential data leak.
    void buildCar() { std::cout << "address of car1  = " << myData; } // Member Function
};

int main() {
    Item item1(1, new Car(2019));
    item1.buildCar();

}

Если вам интереснонекоторые из этих вещей, ищите синтаксис конструктора, списки инициализатора конструктора и оператор new, они очень важны для C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...