Effective C++(第3版)Item 4代码布局
Effective C++ (3rd edition) Item 4 code layout
在 Scott Meyers 的 Effective C++: 55 Specific Ways to Improve Your Programs and Designs(第 3 版) 中,他在第 4 项中描述了如何定义非本地静态对象的初始化在不同的翻译单元中崩溃并给出了一堆示例代码。
然而,我对代码布局感到困惑,它应该是什么?
我尝试过的:
fileSystem.h
#include <iostream>
class FileSystem
{
public:
std::size_t numDisks() const;
};
fileSystem.cpp
#include "fileSystem.h"
std::size_t FileSystem::numDisks() const
{
return 1;
}
extern FileSystem tfs;
directory.h
class Directory
{
public:
Directory();
};
directory.cpp
#include <iostream>
#include "fileSystem.h"
#include "directory.h"
Directory::Directory()
{
std::size_t disks = tfs.numDisks();
std::cout << disks << std::endl;
}
Directory tempDir;
int main()
{
return 0;
}
而执行g++ directory.cpp fileSystem.cpp
时,结果是这样的:
directory.cpp: In constructor ‘Directory::Directory()’:
directory.cpp:7:25: error: ‘tfs’ was not declared in this scope
7 | std::size_t disks = tfs.numDisks();
|
我对 C++ 中的 #include
东西有点不高兴,我希望它不会妨碍我理解 Effective C++ Item 4 中示例代码的正确布局。
您需要将 extern FileSystem tfs;
从 fileSystem.cpp
移动到头文件 fileSystem.h
才能编译它。
如果应该可以link,你还需要在fileSystem.cpp
中定义它。
fileSystem.h
extern FileSystem tfs;
fileSystem.cpp
FileSystem tfs;
在 Scott Meyers 的 Effective C++: 55 Specific Ways to Improve Your Programs and Designs(第 3 版) 中,他在第 4 项中描述了如何定义非本地静态对象的初始化在不同的翻译单元中崩溃并给出了一堆示例代码。
然而,我对代码布局感到困惑,它应该是什么?
我尝试过的:
fileSystem.h
#include <iostream> class FileSystem { public: std::size_t numDisks() const; };
fileSystem.cpp
#include "fileSystem.h" std::size_t FileSystem::numDisks() const { return 1; } extern FileSystem tfs;
directory.h
class Directory { public: Directory(); };
directory.cpp
#include <iostream> #include "fileSystem.h" #include "directory.h" Directory::Directory() { std::size_t disks = tfs.numDisks(); std::cout << disks << std::endl; } Directory tempDir; int main() { return 0; }
而执行g++ directory.cpp fileSystem.cpp
时,结果是这样的:
directory.cpp: In constructor ‘Directory::Directory()’:
directory.cpp:7:25: error: ‘tfs’ was not declared in this scope
7 | std::size_t disks = tfs.numDisks();
|
我对 C++ 中的 #include
东西有点不高兴,我希望它不会妨碍我理解 Effective C++ Item 4 中示例代码的正确布局。
您需要将 extern FileSystem tfs;
从 fileSystem.cpp
移动到头文件 fileSystem.h
才能编译它。
如果应该可以link,你还需要在fileSystem.cpp
中定义它。
fileSystem.h
extern FileSystem tfs;
fileSystem.cpp
FileSystem tfs;