java - 从 Java 导入到 C++ 包括

标签 java c++ class

我一直在努力理解 C++ 类如何包含其他类。我猜这在没有任何先入为主的观念的情况下更容易理解。

假设我的两个类是 Library 和 Book。我每个都有一个 .h 和 .cpp 文件。我的“main.cpp”运行一个简单的控制台应用程序来使用它们。这是一个简单的例子:

//Library.h

#ifndef LIBRARY_H_
#define LIBRARY_H_
#endif

class Library
{

public:
 Library();
 ~ Library();

private:
 Book *database;
};

这会引发有关“Book does not name a type”的错误。在 Java 中,我会导入一些包,例如 org.me.Domain.Book。有人可以解释一下这在 C++ 中是如何工作的吗?

最佳答案

在 C++ 中,源文件在概念上与类定义完全分开。

#include 和头文件在基本文本级别工作。 #include "myfile" 只是在 include 指令所在的位置包含文件 myfile 的内容。

只有在这个过程发生之后,生成的文本 block 才会被解释为 C++ 代码。没有语言要求必须在名为 Book.h 的文件中定义名为 Book 的类。尽管强烈建议您遵循这样的约定,但请务必记住,在调试丢失的声明或定义问题时,这不是给定的。

当解析您的 Library.h 文件时,编译器必须在类的定义中使用标识符 Book 时看到它的声明

由于您只声明了一个类型为“指向 Book 的指针”的成员变量,您只需要一个声明而不需要完整的定义,所以如果 Book 是一个类,那么最简单的“修复”是在 Library 的定义之前为它添加一个前向声明。

例如

class Book;

class Library
{
    // definition as before
};

包括守卫

看起来你可能有一些 include guard 错误。因为每个翻译单元只能定义一次类,所以头文件中的定义通常受到包含保护。这些确保如果通过不同的包含文件多次包含相同的 header ,则它提供的定义不会被多次看到。包括 guard 应该这样安排。查看您的 Library.h,可能是您的 include guards 没有正确终止。

我的类.h:

#ifndef MYCLASS_H
#define MYCLASS_H

class MyClass
{
};

// The #ifndef is terminated after all defintions in this header file
#endif //MYCLASS_H

关于java - 从 Java 导入到 C++ 包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2294809/

相关文章:

java - 查找数组实现包中的第 k 个最大元素

java - 从 XML 文件读取内容时如何保留 "Character Reference Codes"(<)

java - 如何从主题中删除消息

php - 如何使用vkapi库PHP

c++ - C++ 中不同实例的成员函数的不同实现

python - 如何在Python类中调用 "namespace"方法

java - 未找到 sdk_config.properties

c++ - 我正在尝试使用 C++ 通过命令行打开 gnuplot 并编译图形

c++ - QT Qvtkwidget。交互方式改变

c++ - 确定升压变体中的最大 sizeof()