У класса нет члена с именем

У меня проблема с доступом к функции из класса с объектом класса в моей 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

Ответ 1

У меня была аналогичная проблема. Оказалось, я включил старый файл заголовка с тем же именем из старой папки. Я удалил старый файл, изменив директиву #include, чтобы указать на мой новый файл, и все было хорошо.

Ответ 2

В большинстве случаев проблема связана с ошибкой со стороны человека. В моем случае я использовал несколько классов, имена которых похожи. Я добавил метод empty() под один класс; однако мой код вызывал метод empty() из другого класса. В этот момент ум застрял. Я запустил make clean и переделал, думая, что это какая-то более старая версия заголовка. Уйдя на мгновение, я сразу обнаружил эту проблему. Мы, программисты, в первую очередь склонны обвинять других. Может быть, мы должны настаивать на том, что сначала мы ошибаемся.

Иногда я забываю записать последнее обновление на диск и посмотреть правильную версию кода, но компилятор видит неправильную версию кода. Эта ситуация может быть менее важной для IDE (я использую vi для кодирования).

Ответ 3

Я не мог найти ответ на вопрос, поэтому я попытался и не ошибся.

Скомпилирован следующим образом:

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)

Ответ 4

Когда у меня возникла эта проблема, у меня был ранее созданный файл .o в том же каталоге. Я удалил этот файл, и компиляция работала хорошо. Чтение того, что вы пытаетесь создать объект, может означать, что у вас есть ссылка на более старый .o файл, и это приводит к его отказу.

Ответ 5

Не запомнили ли вы включить заключительную фигуру в основном?

#include <iostream>
#include "Attack.h"

using namespace std;

int main()
{
  Attack attackObj;
  attackObj.printShiz();
}

Ответ 6

Попробуйте определить функции прямо в заголовке

 #ifndef ATTACK_H
 #define ATTACK_H

 class Attack {
     public:
         Attack(){};
         void printShiz(){};
     protected:
     private: };

 #endif // ATTACK_H

и скомпилировать. Если компилятор не жалуется на дубликаты определений, это означает, что вы забыли скомпилировать файл Class.cpp, тогда вам просто нужно сделать это (добавьте его в свой файл Makefile/project/solution... какую инструментальную цепочку вы используете?)

Ответ 7

Я знаю, что это год, но я столкнулся с этим с той же проблемой. Моя проблема заключалась в том, что у меня не было конструктора в моем файле реализации. Я думаю, что проблема здесь может быть отметкой комментария в конце файла заголовка после #endif...

Ответ 8

У вас есть опечатка в вашем .h? Я однажды наткнулся на эту ошибку, когда у меня был метод, правильно названный в моем главном, но с опечаткой в ​​.h/.cpp( "g" против "q" в имени метода, что сделало его любопытным). Он подпадает под категорию "copy/paste error".