我一直在努力理解 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/