Выражение должно иметь тип указателя на объект

Уважаемое полезное сообщество stackoverflow,

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

У меня есть проект для школы, где я должен определить структуры, а не использовать массив указателей для хранения данных. В этом цикле я получаю сообщение об ошибке «Выражение должно иметь указатель на тип объекта»

вот весь код Большое спасибо за Вашу помощь

Решение

Вы, вероятно, имели в виду:

поскольку c_info это массив, делая c_info[i] вы получите доступ к i -й экземпляр (объект) Employee класс в c_info массив, а затем получить hoursWorked через . оператор.

Теперь вы можете ясно видеть, что ваш вариант просто не имеет смысла, так как hoursWorked это просто целочисленный тип, а не массив, и поэтому вы не можете применить [] оператор к нему.

Другие решения

c_info это указатель на Сотрудника. Вы можете назначить один выделенный объект для такого указателя или, в вашем случае, несколько ( new с синтаксисом массива). Так что это указывает на массив сотрудников.

Вы разыменовали этот указатель. Поскольку он указывает на массив (нескольких) сотрудников, он также указывает на первую запись. Затем вы получаете доступ к целочисленной переменной-члену, что все еще возможно. Но затем вы пытаетесь использовать оператор индекса массива ( [] ) на целочисленное значение, что невозможно.

Вы, вероятно, хотели получить доступ к переменной-члену i -я запись вашего выделенного массива. Таким образом, вы должны изменить это: сначала используйте оператор индекса массива, а затем получите доступ к члену этого конкретного сотрудника.

Читайте также:  Армейская пружина упражнение техника выполнения

c_info[i] в низкоуровневых словах означает: взять указатель c_info , добавлять i раз размер типа, на который он указывает (поэтому он указывает на i -я запись) и разыменование этого адреса. Это означает, что c_info[i] на самом деле это сотрудник на i -й индекс (но не указатель).

Затем вы хотите получить доступ к члену этого сотрудника. Если бы он все еще был указателем, вам пришлось бы использовать оператор стрелки, но так как вы использовали оператор индекса массива ( [i] ), вы уже разыменовали его, вы правильный оператор точки:

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

В языке С++ разрешено наряду со стандартными использование производных типов , полученных на основе более простых базовых типов . Производные типы можно условно подразделить на две группы:

Непосредственно производные типы. Эти типы являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции преобразования типов . В группу непосредственно производных типов входят:

  • массивы;
  • указатели;
  • ссылки;
  • перечисления.

Составные производные типы. В группу составных производных типов входят типы, являющиеся производными от различных существующих или ранее объявленных типов:

  • классы;
  • структуры;
  • объединения.

Переименование типов

В некоторых программных кодах бывает удобно вводить новые обозначения имен отдельных используемых типов данных. Задавать новое имя типу можно с помощью ключевого слова typedef .

Такое имя можно затем использовать так же, как и стандартное имя типа:

Рассмотрим тип указатель . Указатели являются специальными объектами в программах на С++. Они предназначены для хранения адресов памяти.

Рассмотрим пример ( рис. 4.1). Когда компилятор обрабатывает оператор определения переменной, например, int a=10; , то в памяти выделяется участок памяти в соответствии с типом переменной и записывается в этот участок указанное значение (размер типа int не менее 2 байтов и зависит от реализации). Все обращения к переменной a компилятор заменит на адрес области памяти, в которой хранится эта переменная . Операция &a является операцией взятия адреса ее операнда.

Читайте также:  Что такое mcu в автомагнитоле

Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями.

Указатель – именованный объект , предназначенный для хранения адреса области памяти (объекта, непоименованной области оперативной памяти либо точки входа в функцию).

Указатель не является самостоятельным типом, он всегда связан с каким-то другим типом. Указатели делятся на две категории:

  • указатели на объекты;
  • указатели на функции.

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

Указатели на объекты

В общем случае синтаксис определения указателя на объект :

При определении указателя специфицируется имя указателя-переменной (в дальнейшем указатель ) и тип объекта , на который он ссылается.

Тип задает тип объекта , адрес которого будет содержать определяемая переменная и может соответствовать базовому, пустому (свободному, родовому, то есть типу void ), перечислению, структурному типу и типу объединения. Реально указатель на void ни на что не указывает, но обладает способностью указывать на область любого размера после его типизирования каким-либо объектом.

Описатель – это идентификатор , определяющий имя объявляемой переменной типа указатель или конструкция, которая организует непосредственно доступ к памяти. Описателю обязательно должна предшествовать звездочка (*).

Знак ‘*’ является унарной операцией косвенной адресации , его операнд – указатель , а результат – адрес объекта, на который указывает операнд . Адресация является косвенной, так как обращение к области памяти осуществляется не напрямую по адресу (например, 1А2В), а через объект , которому в памяти соответствует определенный участок. Объем памяти, который выделяется для хранения данных, определяется типом данных и моделью памяти. Для приведенной на рисунке 2 модели памяти адресом переменной типа float с именем summa является 0012FF48, адресом переменной типа int с именем date является 0012FF54, адресом переменной типа char с именем ch является 0012FF63.

Читайте также:  Айфон 5s греется и выключается

Я создал свои собственные векторов и массивов классов, которые я протестированные и работают нормально. Однако, в следующем коде у меня возникли проблемы с доступом методы в классе AccountInfo. _accounts объявлен как это:

Перед тем, _accounts только типа AccountInfo. После перехода на вектор, каждый экземпляр, который использует _accounts имеет ошибку: Выражение должно иметь тип указателя.

Есть ли способ, чтобы получить доступ к методам AccountInfo с переменной _accounts?

Вы определили массив векторов:

Это не то же самое, объявив один вектор с Capcity 200. Если вы используете стандартный вектор, то она будет выглядеть следующим образом:

Оцените статью
Добавить комментарий

Adblock
detector