C++ 接口(interface)错误;标识符 "class"未定义

标签 c++ oop interface syntax-error

使用:VS2010:新项目 -> Windows32 控制台应用程序 -> 空项目

语言:C++

问题:我正在尝试使用两个通过 1 个虚拟方法实现接口(interface)的类进行简单的接口(interface)测试。我还尝试使用这两个类中的构造函数来设置默认值。当尝试创建任一类的对象时,会出现主要问题; IDE 提示标识符“class”未定义。

我已经检查了数十篇具有相同错误的其他帖子,但其中大多数是在使用实例化(正确的术语?)时出现的错误

Class obj(); 

而不是

Class obj;

其他线程中的另一个问题是头文件未包含在 main.cpp 和具体类(正确的术语?)中。还有其他问题涉及包含的顺序(基类应该是第一个),甚至是构造函数/解构函数的不正确使用。

我已经检查了这些问题,看看它们是否对我有用,但无法找出问题所在。

任何见解将不胜感激!

错误:(全部在main.cpp中)

Error   1   error C2065: 'Human' : undeclared identifier 6  1   interfaceGameTest
Error   2   error C2146: syntax error : missing ';' before identifier 'hum1' 6  1   interfaceGameTest
Error   3   error C2065: 'hum1' : undeclared identifier 6   1   interfaceGameTest
Error   4   error C2065: 'Orc' : undeclared identifier  7   1   interfaceGameTest
Error   5   error C2146: syntax error : missing ';' before identifier 'orc1' 7  1   interfaceGameTest
Error   6   error C2065: 'orc1' : undeclared identifier 7   1   interfaceGameTest
Error   7   error C2065: 'hum1' : undeclared identifier 10  1   interfaceGameTest
Error   8   error C2227: left of '->getHP' must point to class/struct/union/generic type 10 1   interfaceGameTest

代码:

IPc.h

#ifndef IPC_H_HAS_BEEN_INCLUDED
#define IPC_H_HAS_BEEN_INCLUDED

class IPc {
  private:
    int hp;
    int mana;
    int endurance;

  public:
    void setHP(int h) { hp = h; }
    void setMP(int m) { mana = m; }
    void setEnd(int e) { endurance = e; }

    int getHP() { return hp; }
    int getMP() { return mana; }
    int getEnd() { return endurance; }

    virtual int Attack() = 0;
};
#endif

IPc.cpp

#include "IPc.h"

class Human: public IPc
{
    public:
        Human::Human()
        {
            this->setHP(10);
            this->setMP(5);
            this->setEnd(10);
        }
        Human::~Human(){}

        int IPc::Attack() // I have tried just "int Attack()" as well
        {
            return 1;
        }
};

class Orc: public IPc
{
    public:
        Orc::Orc()
        {
            this->setHP(20);
            this->setMP(0);
            this->setEnd(20);
        }
        Orc::~Orc() {}

        int IPc::Attack()
        {
            return 5;
        }
};

main.cpp

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

int main()
{
    Human hum1; // error Human undefined
    Orc orc1; // error Orc undefined
    int humHP = 0;

    humHP = hum1->getHP();

    std::cout << "Human HP is: " << humHP << std::endl;
    return 0;
}

编辑

我放置

class Human: public IPc { virtual int Attack() };

在IPc.h内(在基类之后)和#endif之前(也为Orc做了一个)。我也变了

humHP = hum1->getHP();

humHP = hum1.getHP();

这似乎解决了之前的问题(感谢 Mat 和 Rahul)。我现在收到“类”类型重新定义错误。我相信这与包含 guard 有关。我是否需要在 .h 文件中用自己的一组防护来包围每个单独的类,或者我是否正确地实现了它们?

编辑2

我将这两个类声明放在它们自己的头文件中,并带有它们自己的防护。这似乎解决了“'class'类型重新定义”的问题。尽管现在两个派生类的虚拟攻击调用上都存在未解析的外部符号错误。

最佳答案

  1. 不允许在类成员声明中使用限定名称。 IE。在类 Human 中声明类 Human 的构造函数时,不允许调用它 Human::Human()。它应该只是Human()。这同样适用于所有其他方法。

  2. 尝试在其他类中声明方法 int IPc::Attack() 根本没有任何意义。它应该只是int Attack()

  3. 您在 IPc.cpp 中声明了类 HumanOrc。这些类仅在 IPc.cpp 中可见,在其他地方不可见。在 C++ 语言中,程序范围类的类声明通常放置在头文件中,就像使用 IPc 类一样。

关于C++ 接口(interface)错误;标识符 "class"未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30069372/

相关文章:

oop - 哪种设计模式最好允许来自多个提供者的一个公共(public)类?

java - 如何定义抛出通用异常类型的接口(interface)?

java - EJB - Home/Remote 和 LocalHome/Local 接口(interface)

javascript - 元素隐式具有 'any' 类型,因为类型 'xxx' 没有索引签名。ts(7017)

c++ - 无法根据 boolean 值结束 do/while 循环 - C++

c++ - 使用 C++ 和程序集在运行时分配和创建新函数

c++ - Unordered_set迭代器随机

c++ - 如何在编译时获得 'fill up' 大小的余数?

Python设计题

c++ - 了解在STL映射中使用的运算符重载 'const'语法