Ответ 1
У меня была аналогичная проблема. Оказалось, я включил старый файл заголовка с тем же именем из старой папки. Я удалил старый файл, изменив директиву #include, чтобы указать на мой новый файл, и все было хорошо.
У меня проблема с доступом к функции из класса с объектом класса в моей main
функции. Я просто пытаюсь создать объект для класса и использовать этот объект для доступа к функции внутри этого файла .cpp
класса. Я продолжаю получать сообщение об ошибке, и я даже создал простейшую программу для его тестирования, и все равно получаю сообщение об ошибке.
Главный:
#include <iostream>
#include "Attack.h"
using namespace std;
int main()
{
Attack attackObj;
attackObj.printShiz();
}
Заголовок класса:
#ifndef ATTACK_H
#define ATTACK_H
class Attack
{
public:
Attack();
void printShiz();
protected:
private:
};
#endif // ATTACK_H
Класс .cpp:
#include <iostream>
#include "Attack.h"
using namespace std;
Attack::Attack() {
}
void Attack::printShiz() {
cout << "Test" << endl;
}
Как я могу исправить эту ошибку? Каждый раз, когда я пытаюсь получить доступ к функции printShiz()
в классе Attack
, используя объект в моей main
функции, я получаю сообщение об ошибке, и она не думает, что эта функция существует в этом классе.
Ошибка:
ошибка: в классе Attack нет члена с именем printShiz
У меня была аналогичная проблема. Оказалось, я включил старый файл заголовка с тем же именем из старой папки. Я удалил старый файл, изменив директиву #include, чтобы указать на мой новый файл, и все было хорошо.
В большинстве случаев проблема связана с ошибкой со стороны человека. В моем случае я использовал несколько классов, имена которых похожи. Я добавил метод empty() под один класс; однако мой код вызывал метод empty() из другого класса. В этот момент ум застрял. Я запустил make clean и переделал, думая, что это какая-то более старая версия заголовка. Уйдя на мгновение, я сразу обнаружил эту проблему. Мы, программисты, в первую очередь склонны обвинять других. Может быть, мы должны настаивать на том, что сначала мы ошибаемся.
Иногда я забываю записать последнее обновление на диск и посмотреть правильную версию кода, но компилятор видит неправильную версию кода. Эта ситуация может быть менее важной для IDE (я использую vi для кодирования).
Я не мог найти ответ на вопрос, поэтому я попытался и не ошибся.
Скомпилирован следующим образом:
g++ -c class.cpp
g++ -c main.cpp
g++ -o main class.o main.o
Ошибок нет, работает хорошо. Версия gcc используется для компиляции. gcc версия 4.1.2 20080704 (Red Hat 4.1.2-46)
Когда у меня возникла эта проблема, у меня был ранее созданный файл .o в том же каталоге. Я удалил этот файл, и компиляция работала хорошо. Чтение того, что вы пытаетесь создать объект, может означать, что у вас есть ссылка на более старый .o файл, и это приводит к его отказу.
Не запомнили ли вы включить заключительную фигуру в основном?
#include <iostream>
#include "Attack.h"
using namespace std;
int main()
{
Attack attackObj;
attackObj.printShiz();
}
Попробуйте определить функции прямо в заголовке
#ifndef ATTACK_H
#define ATTACK_H
class Attack {
public:
Attack(){};
void printShiz(){};
protected:
private: };
#endif // ATTACK_H
и скомпилировать. Если компилятор не жалуется на дубликаты определений, это означает, что вы забыли скомпилировать файл Class.cpp, тогда вам просто нужно сделать это (добавьте его в свой файл Makefile/project/solution... какую инструментальную цепочку вы используете?)
Я знаю, что это год, но я столкнулся с этим с той же проблемой. Моя проблема заключалась в том, что у меня не было конструктора в моем файле реализации. Я думаю, что проблема здесь может быть отметкой комментария в конце файла заголовка после #endif...
У вас есть опечатка в вашем .h? Я однажды наткнулся на эту ошибку, когда у меня был метод, правильно названный в моем главном, но с опечаткой в .h/.cpp( "g" против "q" в имени метода, что сделало его любопытным). Он подпадает под категорию "copy/paste error".