【问题标题】:Call a C++ class method without a class instance?在没有类实例的情况下调用 C++ 类方法?
【发布时间】:2021-01-07 16:40:38
【问题描述】:

长话短说,我正在尝试构建一个包装器以从 C 主函数访问 C++ 源代码(由于嵌入式系统,我必须进行转换);但是,在不创建该类的实例的情况下,我无法将类中的方法调用到外部函数。

我想从我的 C 代码中传递这个 *side 指针,计算它的立方,并返回立方值。我已经用简单的指针函数和变量测试了我的包装器,它工作得很好,但是我在使用类方法时遇到了问题。这是我的源代码,我在最后一行犯了错误......:

class Cube
{
public:
    static int getVolume(int *side)
    {
        return *side * *side * *side;     //returns volume of cube
    }
};

void Cube_C(int *side) 
{
    return Cube.getVolume(*side);
}

【问题讨论】:

  • 为什么 side 是 int* 而不仅仅是 int
  • 您好!它是一个 int*,因为我从 C 中输入一个值。我的 C 代码如下所示:int cubeSide = 5; printf("Cube of 5 is: %d\n\n", GetVolume_C(&cubeSide)); 同时我在头文件中使用extern"C" 将 C 与 C++ 链接起来。
  • 我仍然不明白为什么需要将其作为指针而不是普通的int 发送?如果您在我给出的答案中查看我的示例,则没有指针。

标签: c++ class methods instance call


【解决方案1】:

对于这个特定的示例,您根本不需要它们是类,因为Cube 没有状态。只做一个函数:

int Cube_Volume(int side) { return side * side * side; }

如果您希望保存状态的对象可以从 C 中重用,您确实需要一个实例:

class Cube {
public:
    Cube(int side) : m_side(side) {}
    int getVolume() const { return m_side * m_side * m_side; }

private:
    int m_side;
};

然后在你的 C 接口中:

extern "C" int Cube_Volume(int side) { return Cube(side).getVolume(); }

编辑:我在github 添加了一个更详细的示例,以展示如何创建 C 函数来创建和操作 C++ 对象。

【讨论】:

  • 哇,感谢您的回答。我真的需要学习更多的 C++ 来了解这里发生的事情,但可能对我的未来非常有用! (抱歉,我不能投票给新的堆栈溢出)
  • @PolarBear 没关系 :-) 在 C++ 类部分发生的情况是 Cube(side) 实例化一个临时对象,并将 side 设置为用户调用 Cube_Volume 的任何内容。然后它在该临时对象上调用getVolume()。然后该对象被自动销毁。优化后,这可能只是直接执行side * side * side
  • @PolarBear 我开始了一个 github 项目(请参阅答案中的更新),我将来可能会扩展它。它仅包含一个 C++ 类示例和用于创建对象、调用对象的成员函数然后销毁它的 C 函数。
  • 非常感谢。我将继续发布有关该主题的问题。如果您将继续扩展,下一个有用的扩展建议是模板类和从 C++ 到 C 的动态数组中的动态(堆)内存分配。
  • @PolarBear 不客气!如果我没记错的话,我在这里的答案中为动态内存管理制作了一组类似类的 C 函数,但那是在纯 C 中。对于 C++,可以简单地为特定类型的 std::vector<> 创建一个包装器想要存储。由于 C 中不存在模板,因此必须为每种类型进行显式实例化。
【解决方案2】:

您可以在没有实例的情况下调用类的 static 成员函数:只需在成员函数名称前添加类名称,然后是 scope resolution operator (::)(而不是类成员运算符 @987654324 @,正如你所尝试的那样)。

此外,在您的Cube_C 函数中,您应该取消引用side 指针,因为getVolume 函数将int * 指针作为其参数。您需要将该函数的返回类型声明为int(不是void):

int Cube_C(int *side) 
{
    return Cube::getVolume(side);
}

【讨论】:

  • 感谢您的回答,我已经尝试过那个灵魂,但是我仍然收到返回值与函数类型不匹配的错误。
  • @PolarBear 哎呀——我的错误(见编辑的答案)。我忘记了对您的 Cube_C 函数的第二次更正!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2010-09-28
  • 2015-08-05
相关资源
最近更新 更多