【问题标题】:Use of undefined type [duplicate]使用未定义类型[重复]
【发布时间】:2013-08-19 12:44:26
【问题描述】:
#include <iostream>

class Core;
class State;

int main (){
        std::cin.get();
        return 0;
}

class State{
public:
    State(Core* core){
        core->setState();
    }
};

class Core{
public:
    Core(){
        State state(this);
    }
    void setState(){
        std::cout << "setting state" << std::endl;
    }
};

我不断收到“使用未定义类型”错误。我认为如果我转发声明这两个类,它会解决问题,但我无法弄清楚。我缺少的只是愚蠢的 c++ 语法吗?

编辑:抱歉,gamestate 错字,我已将其更改为 State,但它仍然会产生错误。

【问题讨论】:

  • 你有 class GameState; 但该类实际定义在哪里?

标签: c++


【解决方案1】:

State::State 中,您在实际定义之前使用Core。通过将构造函数实现移出类定义,您可以在示例中轻松解决此问题:

class State{
public:
    State(Core* core);
};

class Core{
   // This stays the same...
};

State::State(Core* core)
{
   core->setState();
}

在实践中,将这些函数的实现放在单独的实现 (.cpp) 文件中更为常见,在这种情况下,前向声明将按您的预期工作。

在那种情况下:

// State.h
class Core;

class State{
public:
    State(Core* core);
};

// Core.h
#include "State.h"
#include <iostream> //This is probably a good reason to further separate
                    //Core.h into Core.h and Core.cpp

class Core{
public:
    Core(){
        State state(this);
    }

    void setState(){
        std::cout << "setting state" << std::endl;
    }
};

以及实现文件:

// State.cpp
#include "State.h"
#include "Core.h"

State::State(Core* core)
{
   core->setState();
}

【讨论】:

  • 不,它声明了类型,它没有定义它。
  • 非常感谢,我自己永远也做不到。
【解决方案2】:

当您只需要命名时,您可以前向声明类型,例如,形成指针、引用、函数值参数或返回类型。如果您大量使用它,例如在函数定义中或通过取消引用指针,您需要该定义。关于这个问题的处理方法是声明成员函数而不是在State的类定义中定义它。相反,一旦看到 Core 的定义,您就可以定义它:

State::State(Core* core){
    core->setState();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-13
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2015-02-12
    • 2016-07-17
    相关资源
    最近更新 更多