c++ 使用未定义的类型[重复]

vngu2lb8  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(153)
    • 此问题在此处已有答案**:

(13个答案)
9年前关闭。

#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++语法,我错过了吗?

vbopmzt1

vbopmzt11#

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();
}
1cosmwyk

1cosmwyk2#

当你只需要命名时,你可以正向声明一个类型,例如,形成指针,引用,函数值参数,或者返回类型。如果你实际上使用它,例如,在函数定义中或者通过解引用指针,你需要定义。处理这个问题的方法是声明成员函数,而不是在State的类定义中定义它。相反,一旦看到Core的定义,你就可以定义它

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

相关问题