Непонимание того, как указатели и классы работают вместе в этом примере

Хмммм, я в тупике, используя Visual Studio 2012, у меня осталась только одна ошибка в моем проекте, и я умираю, чтобы проверить ее. Да, это для класса C++, и я надеюсь, что разместил достаточно кода.

Я получаю сообщение об ошибке:

C2227 слева от ->writeData должен указывать на класс/структуру/объединение/общий тип

В предыдущем проекте эта строка имела элемент массива указателей (я полагаю, указатель Employee*), и она работала так:

Employee* myEmployees[MAX_EMPS];
...
myEmployees[i]->writeData(outputEmployee);

Поэтому я реализую вектор Employee* и предполагаю, что он также содержит указатели:

MyVector<Employee*> employeePtrList;

Я делаю следующие пару шагов немного косвенно, но уточнил это у профессора Дебри:

Employee* empPtr1 = new HourlyEmployee(EMP1_ID, EMP1_NAME, EMP1_ADDRESS, EMP1_PHONE, EMP1_HOURS, EMP1_WAGE);
2...
3...
4...

employeePtrList.push_back(empPtr1);
2...
3...
4...

Затем позже в программе эта строка дает мне ошибку:

employeePtrList.at(i)->writeData(outputEmployee);

Я пробовал разные вещи, если я разыменовываю его с помощью * (employeePtrList) просто для удовольствия, он меняет ошибку intellisense, но я все равно получаю то же самое:

C2227 слева от ->writeData должен указывать на класс/структуру/объединение/общий тип

Есть идеи? Где я запутался, так это в том, что понимаю, что employeePtrLIst - это указатель Employee, так что, может быть, он ищет не в том классе? Я думаю, может быть, я неправильно «указываю» на функцию в классе MyVector?

Спасибо


person JimLohse    schedule 10.04.2014    source источник
comment
Что возвращает employeePtrList.at(i)?   -  person Johnny Mopp    schedule 11.04.2014
comment
Если вы спрашиваете теоретически, я бы предположил, что это указатель на класс Employee, на практике это не сработает. Я думаю, мне нужно выяснить, как это сформировать, чтобы он возвращал что-то из класса MyVector, где существует функция-член?   -  person JimLohse    schedule 11.04.2014
comment
Что такое MyVector‹› Действительно ли это вектор с функцией .at?   -  person user632657    schedule 11.04.2014
comment
Сократите свой пример до наименьшего исполняемого кода, демонстрирующего проблему, и опубликуйте его. Вы даже можете обнаружить проблему самостоятельно, делая это.   -  person ooga    schedule 11.04.2014
comment
Да, это класс с .at в качестве функции-члена. Он действует как вектор с функцией push_back, а также с геттерами и сеттерами.   -  person JimLohse    schedule 11.04.2014
comment
спасибо ога хорошая идея.   -  person JimLohse    schedule 11.04.2014
comment
И возвращает ли at() указатель? Если это ваш собственный класс, вы должны проверить это, потому что мне это кажется разумным.   -  person user632657    schedule 11.04.2014
comment
вы включаете заголовок в исходный файл?   -  person Siamak M. Mirzaie    schedule 11.04.2014
comment
ОК, спасибо за всю вашу помощь, я думаю, вы все дали мне толчок, в котором я нуждался. Предполагается, что проект использует наш векторный класс и полиморфизм в некоторых классах сотрудников, я опубликую ответ, когда разберусь, спасибо!   -  person JimLohse    schedule 11.04.2014
comment
И @Siamak да, спасибо.   -  person JimLohse    schedule 11.04.2014
comment
Вы забыли включить заголовок, который фактически определяет Employee. Вы не можете вызывать функции в объявленном вперед классе   -  person cppguy    schedule 11.04.2014
comment
Эй, я хочу поблагодарить всех, и особенно за то, что не набросились на меня за то, что я не публикую достаточно информации. Оказывается, Джонни Мопп, ответивший первым, был на правильном пути. Я не возвращал указатель из employeePtrList.at(i), и когда я изменил тип возвращаемого значения на указатель, все стало на свои места.   -  person JimLohse    schedule 12.04.2014
comment
Итак, если бы у меня был совет для другого новичка, просматривающего этот разговор, то только потому, что вы передаете указатель на функцию, это не означает, что она вернет указатель, если только вы явно не сделаете возвращаемый тип указателем, поставив * после него. Дух. Проблема решена, спасибо всем, и в следующий раз я опубликую лучший вопрос! :)   -  person JimLohse    schedule 12.04.2014


Ответы (1)


Не зная точно, как работает MyVector, некоторые вещи на первый взгляд могут пойти не так:

.at() может возвращать ссылку на объект (или даже копию объекта), поэтому вам нужно будет использовать оператор ..

Другая возможность заключается в том, что если .at() возвращает итератор типа Employee*, вам может потребоваться разыменовать итератор (например, (*employeePtrList.at(i))->writeData(outputEmployee);) в зависимости от реализации.

person Qix - MONICA WAS MISTREATED    schedule 10.04.2014
comment
Спасибо, Qix, у тебя тоже все получилось, отличная информация! Я слишком новичок, чтобы проголосовать за это (сказал стыдливо, лол) - person JimLohse; 12.04.2014
comment
Привет @provoutah - Просто сообщаю, что вы можете принять ответ, если он вам помог! - person Qix - MONICA WAS MISTREATED; 05.05.2014