1

Scott Meyers の『Effective C++: 55 Specific Ways to Improvement 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();
      |   

私は#includeC++ の内容に少し動揺しています。それが、Effective C++ 項目 4 のサンプル コードの正しいレイアウトを理解する妨げにならないことを願っています。

4

1 に答える 1

2

コンパイルできるようにするには、ヘッダー ファイルに移動extern FileSystem tfs;する必要があります。fileSystem.cppfileSystem.h

リンクできると思われる場合は、 で定義する必要もありますfileSystem.cpp

fileSystem.h

extern FileSystem tfs;

ファイルシステム.cpp

FileSystem tfs;
于 2021-08-03T13:38:37.653 に答える