【问题标题】:How to instantiate a class within an C++ implementation file? [closed]如何在 C++ 实现文件中实例化一个类? [关闭]
【发布时间】:2019-08-12 20:33:23
【问题描述】:

我正在尝试利用用 C++ 编写的第三方工具的一些功能,并想只创建一个 make 文件并包含该工具的源代码。这很容易,但后来我遇到了一些嵌套在实现文件 (*.cpp) 中的类声明。

问题是,我想使用这些类声明,但不确定如何使用。我现在在一个库中有这个 *.cpp 文件,并希望在我的应用程序源中包含 AClass 并链接到这个库。

下面是这个包中的文件(cclass.cpp)的布局示例。

#include "cclass.h"

class AClass { ... };

int ClassC::getNumber() 
{
    AClass ac;
    int num = ac.useIt();

    return num;
}

有没有办法在我的应用中包含 AClass 并让这个应用链接到一个包含 cclass.cpp 的库?

【问题讨论】:

  • 我猜想在实现文件中声明的类而不是头文件并不意味着您要实例化。它们可能是您不希望代码依赖的实现细节。

标签: c++ c++11 c++14 c++17


【解决方案1】:

如果 cpp 文件中有类声明(实际上是定义),那么它们应该是私有的,并且库的用户不应访问它们。简而言之:您不能也不应该在您的应用中使用此类,因为这是库作者的意图。

【讨论】:

  • .hpp 文件中的声明和.cpp 填充中的定义对我来说听起来很正常。为什么 OP 不应该使用这样的类?
  • 我有点明白你的意思,但在这种情况下,这个类更像是一个帮助者,它为什么会受到保护是没有意义的。我只是看不到这里的预期需要受到保护。在这种情况下,我确信我可以复制它,但是......希望更好。
  • @TedLyngmo,首先,只有前向声明是类声明,其他一切都是类定义,即使没有方法定义。其次,您可以在 OP 的示例中看到,cpp-file 中有一个class AClass definition,这意味着标头中没有这样的定义,否则会导致多重定义错误。
  • @Ender,只有库的作者才能为您提供隐藏此类的理由。如果您有权访问该库的源代码,您可以轻松地修改和重建它以满足您的需求,这基本上是开源的重点。
  • @bazza,如果该类未在匿名命名空间中定义,则实际上它可能是可链接的。我真的不明白为什么编译器会这样区分,以便 ClassC 是可链接的,而 AClass 不是。
猜你喜欢
  • 2010-11-27
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多