我一直在努力理解C++类如何包含其他类.我猜这很容易理解,没有任何先入为主的观念.
假设我的两个课程是图书馆和书籍.我有一个.h和.cpp文件.我的"main.cpp"运行一个简单的控制台应用程序来使用它们.这是一个简单的例子:
//Library.h
#ifndef LIBRARY_H_
#define LIBRARY_H_
#endif
class Library
{
public:
Library();
~ Library();
private:
Book *database;
};
Run Code Online (Sandbox Code Playgroud)
这会引发关于"Book没有命名类型"的错误.在Java中,我会导入一些像org.me.Domain.Book这样的包.有人可以解释一下这在C++中是如何工作的吗?
在C++中,源文件在概念上完全独立于类定义.
#include和头文件在基本文本级别工作.#include "myfile"只需myfile在放置include指令的位置包含文件的内容.
只有在此过程发生后,生成的文本块才会被解释为C++代码.没有语言要求Book必须在被调用的文件中定义被调用的类Book.h.虽然强烈建议您遵循这样的约定,但必须记住,在调试缺少的声明或定义问题时,它不是给定的.
在解析Library.h文件时,编译器必须在标识符Book的定义中看到它在类的定义中使用的声明Library.
由于您只声明了一个类型为"指向Book" 的成员变量,因此您只需要声明而不是完整定义,因此如果Book是一个类,则最简单的"修复"是在定义之前为其添加前向声明的Library.
例如
class Book;
class Library
{
// definition as before
};
Run Code Online (Sandbox Code Playgroud)
包括警卫
看起来你可能有一些包括警卫错误.因为每个翻译单元只能定义一次类,所以头文件中的定义通常用include guard保护.这些确保如果通过不同的包含文件多次包含相同的头,则它提供的定义不会被多次看到.包括警卫应该安排这样的事情.看着你Library.h,可能是你的包含警卫没有正确终止.
myclass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass
{
};
// The #ifndef is terminated after all defintions in this header file
#endif //MYCLASS_H
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
720 次 |
| 最近记录: |