Уважаемое полезное сообщество 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 является операцией взятия адреса ее операнда.
Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями.
Указатель – именованный объект , предназначенный для хранения адреса области памяти (объекта, непоименованной области оперативной памяти либо точки входа в функцию).
Указатель не является самостоятельным типом, он всегда связан с каким-то другим типом. Указатели делятся на две категории:
- указатели на объекты;
- указатели на функции.
Эти категории указателей отличаются друг от друга свойствами и правилами манипулирования. Каждый указатель имеет соответствующий тип.
Указатели на объекты
В общем случае синтаксис определения указателя на объект :
При определении указателя специфицируется имя указателя-переменной (в дальнейшем указатель ) и тип объекта , на который он ссылается.
Тип задает тип объекта , адрес которого будет содержать определяемая переменная и может соответствовать базовому, пустому (свободному, родовому, то есть типу void ), перечислению, структурному типу и типу объединения. Реально указатель на void ни на что не указывает, но обладает способностью указывать на область любого размера после его типизирования каким-либо объектом.
Описатель – это идентификатор , определяющий имя объявляемой переменной типа указатель или конструкция, которая организует непосредственно доступ к памяти. Описателю обязательно должна предшествовать звездочка (*).
Знак ‘*’ является унарной операцией косвенной адресации , его операнд – указатель , а результат – адрес объекта, на который указывает операнд . Адресация является косвенной, так как обращение к области памяти осуществляется не напрямую по адресу (например, 1А2В), а через объект , которому в памяти соответствует определенный участок. Объем памяти, который выделяется для хранения данных, определяется типом данных и моделью памяти. Для приведенной на рисунке 2 модели памяти адресом переменной типа float с именем summa является 0012FF48, адресом переменной типа int с именем date является 0012FF54, адресом переменной типа char с именем ch является 0012FF63.
Я создал свои собственные векторов и массивов классов, которые я протестированные и работают нормально. Однако, в следующем коде у меня возникли проблемы с доступом методы в классе AccountInfo. _accounts объявлен как это:
Перед тем, _accounts только типа AccountInfo. После перехода на вектор, каждый экземпляр, который использует _accounts имеет ошибку: Выражение должно иметь тип указателя.
Есть ли способ, чтобы получить доступ к методам AccountInfo с переменной _accounts?
Вы определили массив векторов:
Это не то же самое, объявив один вектор с Capcity 200. Если вы используете стандартный вектор, то она будет выглядеть следующим образом: