【问题标题】:Call a function that takes in a pointer to the current class from inside the class调用一个函数,该函数从类内部获取指向当前类的指针
【发布时间】:2022-01-09 23:28:02
【问题描述】:

我试图在 Entity 类之外调用一个将实体指针作为参数的方法,我得到了这个编译器错误:

C3861:“PrintEntity”:找不到标识符

我的代码如下所示:

#include <iostream>

class Entity {
public:
    int x, y;

    Entity() {
        this->x = 0;
        this->y = 0;
    }

    Entity(int x, int y) {
        this->x = x;
        this->y = y;

        PrintEntity(this);
    }

    int GetX() const {
        const Entity* e = this;
    }
}; 

void PrintEntity(Entity* e) {
    std::cout << e->x << ", " << e->y << std::endl;
}

int main() {
    Entity e(5, 5);
}

(这不是实用代码,更多的是概念验证练习)

我知道发生此错误是因为我没有为 PrintEntity 定义原型,因此当在 Entity 构造函数中调用时,Entity 类无法识别 PrintEntity() 函数,但是当我在之前定义原型时Entity 类声明如下:

void PrintEntity(Entity* e);

class Entity {
    ...
}

我收到这 5 个错误:

C2182: 'PrintEntity': illegal use of type 'void'
C2065: 'Entity': undeclared identifier
C2065: 'e': undeclared identifier
C2064: term does not evaluate to a function taking 1 arguments
C2365: 'PrintEntity': redefinition; previous definition was 'data variable'

我对为什么会发生这些错误的理解是 PrintEntity() 原型无法识别 Entity 类,因为它尚未定义。

因此,如果由于尚未定义实体而无法在类定义之前编写原型,并且在没有原型化的情况下无法调用 PrintEntity() 方法,那么如何使这段代码工作同时仍然能够调用 PrintEntity()在 Entity 类内部?

【问题讨论】:

  • 您在PrintEntity 的第一个声明之前也向前声明Entity 类:class Entity;
  • 之前有人告诉过你不要发布文本截图。
  • @user17732522 解决这个问题的另一种方法是将类的实现分离到一个.cpp 文件中。

标签: c++


【解决方案1】:

一种解决方案是在class定义之前转发声明EntityPrintEntity并在类定义之后实现PrintEntity

class Entity;

void PrintEntity(Entity*);

class Entity {
    // ...
};

void PrintEntity(Entity* e) {
    std::cout << e->x << ", " << e->y << std::endl;
}

Demo
(请注意,GetX 不会像它承诺的那样返回 int。这必须修复)

看起来你最好创建一个没有成员函数实现的类定义的头文件。您应该将它们移动到 .cpp 文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2021-12-21
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多