1

./mylib/src ディレクトリに次のファイルがあります。この場所にあるものはすべてユーザーから隠したいです。

message.h ファイル (./mylib/src 内)

// Include guard
namespace MyLib
{
    class Message
    {
    public:
        Message();
        virtual ~Message() = 0;

        virtual bool ToString(std::string& rstrOutput);
        bool IsEmpty() const;

    protected:
        void DoStuff();

    private:
        Message(const Message&); // Disable
        Message& operator=(const Message&); // Disable

    private:
        int m_nData;
    };
}

request.h ファイル (./mylib/src 内)

// Include guard
#include "message.h"

namespace MyLib
{
    class Request : public Message
    {
    public:
        Request();
        ~Request();

        bool ToString(std::string& rstrOutput);

    private:
        bool Build();

    private:
        bool m_b;
    };
}

response.h ファイル (./mylib/src 内)

// Include guard
#include "message.h"

namespace MyLib
{
    class Response : public Message
    {
    public:
        Response();
        ~Response();

        std::string GetSomething() const;
    };
}

ライブラリを配布するとき、ユーザーが 1 つのヘッダー ファイル (./mylib/include/mylib/mylib.h など) のみを #include して、要求と応答を使用できるようにしたいと考えています。そこで、次のような 1 つの大きなヘッダー ファイルを作成しました。

mylib.h ファイル (./mylib/include/mylib 内)

// Include guard
#include <string>

namespace MyLib
{
    class Message
    {
    public:
        Message();
        virtual ~Message() = 0;

        virtual bool ToString(std::string& rstrOutput);
        bool IsEmpty() const;
    };

    class Request : public Message
    {
    public:
        Request();
        ~Request();

        bool ToString(std::string& rstrOutput);
    };

    class Response : public Message
    {
    public:
        Response();
        ~Response();

        std::string GetSomething() const;
    };
}

#endif

しかし、問題は、ライブラリの公開部分を変更したり、新しいクラスを追加したりするたびに、mylib.h ファイルも更新する必要があり、不便です。同じことを達成するためのより良い方法は何ですか?

4

2 に答える 2

2

「/src」から3つの個別のヘッダーを削除し、実装ファイル(「/ src」にある)の「/include」から1つのパブリックヘッダーも使用します。コンパイル中に、インクルードパスを正しく設定するだけで機能します。

于 2013-01-24T16:46:49.343 に答える
0

libまたはdllにすることができ、ユーザーはパブリックAPIのみを呼び出します。ユーザーにヘッダーを提供する場合は、たとえば/exportFolderからすべてを含めるようにユーザーに依頼します。または前のコメントで述べたように。または、あなたがしたように、その大きなヘッダーで十分です。関連するクラスの一部が変更されない限り、変更することはありません。これは正常です。

于 2013-01-24T19:50:04.700 に答える