【问题标题】:Class has no member named类没有名为的成员
【发布时间】:2013-07-05 06:02:19
【问题描述】:

我在使用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;
}

如何解决此错误?每次我尝试使用main 函数中的对象访问Attack 类中的printShiz() 函数时,都会出现错误,并且它认为该类中不存在此函数。

错误:

错误:“class Attack”没有名为“printShiz”的成员

【问题讨论】:

  • 代码看起来不错。也许它正在尝试使用旧版本的标头。
  • 有时“重建所有”可以解决所有问题。
  • 刚刚试了一下,还是一样的错误:/
  • 您应该发布一些重现问题的代码。您发布的代码看起来不错。
  • 建议 2:复制 printShiz() 并将所有内容替换为复制的。有时它所写的内容似乎相同,但是当您在记事本++ 上更改为 ANsi 时,您会发现代码不同。当您在键盘布局之间切换很多时会发生

标签: c++


【解决方案1】:

我遇到了类似的问题。事实证明,我从一个旧文件夹中包含了一个同名的旧头文件。我删除了旧文件,更改了#include 指令以指向我的新文件,一切都很好。

【讨论】:

  • 这是问题的正确答案。它有时会发生。您将头文件复制到另一个路径并对其进行更改,但是由于您在项目中的某个位置包含了旧头文件,因此对成员函数、变量等的更改永远不会出现,并且您会遇到这种“奇怪”的错误。
【解决方案2】:

大多数时候,问题是由于人为方面的一些错误造成的。就我而言,我使用了一些名称相似的类。我在一个类下添加了 empty() 方法;但是,我的代码是从另一个类调用 empty() 方法。那一刻,心都被卡住了。我正在运行 make clean,并且 remake 认为这是使用了一些旧版本的标头。走了一会儿,我马上就发现了这个问题。我们程序员倾向于首先责备他人。也许我们应该先坚持自己是错的。

有时,我忘记将最新更新写入磁盘并查看代码的正确版本,但编译器看到的代码版本错误。这种情况在 IDE 上可能问题不大(我使用 vi 进行编码)。

【讨论】:

    【解决方案3】:

    我有类似的问题。我的包含类定义的头文件不起作用。我无法使用该类的成员函数。所以我只是将我的类复制到另一个头文件中。现在一切正常。

    【讨论】:

      【解决方案4】:

      你记得在 main 中包含右大括号吗?

      #include <iostream>
      #include "Attack.h"
      
      using namespace std;
      
      int main()
      {
        Attack attackObj;
        attackObj.printShiz();
      }
      

      【讨论】:

      • 是的,我只是不小心把它从帖子中遗漏了。
      【解决方案5】:

      尝试在标题中定义函数

       #ifndef ATTACK_H
       #define ATTACK_H
      
       class Attack {
           public:
               Attack(){};
               void printShiz(){};
           protected:
           private: };
      
       #endif // ATTACK_H
      

      并编译。如果编译器没有抱怨重复定义,这意味着您忘记编译 Class.cpp 文件,那么您只需要这样做(将其添加到您的 Makefile/project/solution...您使用的是哪个工具链?)

      【讨论】:

      • 我使用的工具链是mingw32-g++.exe
      • 如果他“忘记编译Class.cpp”会给出未定义的引用链接错误,而不是显示的编译错误
      【解决方案6】:

      我知道这是一岁了,但我遇到了同样的问题。我的问题是我的实现文件中没有构造函数。我认为这里的问题可能是#endif 之后头文件末尾的注释标记...

      【讨论】:

        【解决方案7】:

        您的 .h 中有错字吗?当我在我的 main 中正确调用该方法时,我曾经遇到过这个错误,但是 .h/.cpp 中有一个拼写错误(方法名称中的“g”与“q”,这使得很难发现)。 它属于“复制/粘贴错误”类别。

        【讨论】:

          【解决方案8】:

          也许我晚了 6.5 年。但我正在回答,因为其他人现在可能仍在搜索。我遇到了同样的问题,到处搜索。但后来我意识到我已经把我的代码写在了一个空文件中。如果您创建一个项目并在其中编写代码,则不会出现此错误。

          【讨论】:

            【解决方案9】:

            发生错误的原因是因为所有文件都未被识别为位于同一项目目录中。解决此问题的最简单方法是创建一个新项目。

            文件 -> 项目 -> 控制台应用程序 -> 下一步 -> 选择 C ​​或 C++ -> 为项目命名并选择要在其中创建项目的文件夹 -> 然后点击完成。

            然后通过单击新建-> 类来创建类和头文件。 给类命名并取消选中“使用相对路径”。确保在同一个项目文件夹中创建类和头文件。

            完成这些步骤后,IDE 左侧会显示 Sources 和 Headers 文件夹,其中 main.cpp、theclassname.cpp 和 theclassname.h 都排列得很方便。

            【讨论】:

              猜你喜欢
              • 2011-11-24
              • 1970-01-01
              • 1970-01-01
              • 2013-12-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-26
              相关资源
              最近更新 更多