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;
    };
}

当我分发我的库时,我想让用户#include 仅一个头文件(例如 ./mylib/include/mylib/mylib.h)并使用请求和响应。所以我创建了一个像这样的大头文件:

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”中删除三个单独的标头,并在我的实现文件(位于“/src”中)中使用“/include”中的一个公共标头。在编译期间,您只需正确设置包含路径即可使其正常工作。

于 2013-01-24T16:46:49.343 回答
0

您可以将其设为 lib 或 dll,并且用户只会调用公共 API,如果您想为用户提供标头,则可以要求用户包括 /exportFolder 中的所有内容。或如先前评论中所述。或者就像你所做的那样,那个大标题就足够了。除非某些相关类发生更改,否则您不会修改它。这是正常的。

于 2013-01-24T19:50:04.700 回答