3

Bjarne Stroustrup 建议使用反映真实概念(单位等)的类型,而不是使用原语。例如here,他建议使用“Point”类型而不是两个整数。

这种方法的好处是显而易见的。这意味着编译器可以确保参数具有相同的概念类型,而不仅仅是内存中的相同表示。Stroustrup 给出的一个例子是确保物理值采用相同的单位。

我的问题是如何在实践中做到这一点。创建一个新的 type 类并不难Point,等等,但是我包括一个 3rd 方库,它有它自己的Point对象,当然不能从我的一个构建。如果我包含第二个库,然后包含第三个库,问题就会成倍增加。

人们在实践中对这个问题采取了哪些方法?有没有优雅的解决方案?

4

3 回答 3

4

首先要尝试的当然是尝试使用您使用的库的功能,而不是自己制作。

如果这是不可能的,并且您希望与库中的类似类兼容,则可以创建从库中获取类的构造函数和赋值运算符,并使用其中的数据构造您自己的对象。

就像是

namespace my_project
{
    class my_point
    {
    public:
        my_point(int x_, int y_)
            : x(x_), y(y_)
        {}

        // Constructor taking a foreign library type
        my_point(const OtherLibrary::Point& other)
            : x(other.GetX()), y(other.GetY())
        {}

        // Copy-assignment operator taking foreign library type
        my_point& operator=(const OtherLibrary::Point& other)
        {
            x = other.GetX();
            y = other.GetY();
            return *this;
        }

    private:
        int x;
        int y;
    };
}
于 2013-10-17T04:26:44.647 回答
1

当管理来自多个来源的概念相似的数据类型(即Point来自各种第三方库的类)时,我的直接想法是制定一个所有数据类型都实现的接口,并使用这个接口而不是具体的实现。

正如其他人指出的那样,名称空间有助于管理具有相同名称的类。但是,如果由于某种原因,您需要 aMyCode::Point直接与 a 一起使用TheirCode::Point,则始终可以实现适当的运算符来进行每个可能的转换。不过,这并不是特别明智,因为随着数据类型变体数量的增加,您必须为所有现有数据类型添加转换支持。

于 2013-10-17T04:22:57.930 回答
0

如果我正确理解您的问题,您想修改第三方库中已经存在的类以满足您的需求。在这种情况下,库中的类被程序中定义的类继承。这就像包装库中的类以形成您需要的类。

库的目的是利用现有代码。通常最好使用库中的函数,然后创建自己的函数。是的,使用库确实会产生依赖关系。但是,这就是软件的制作方式。库中的类通常在考虑模块化、松散耦合和高内聚性的情况下制作。因此,他们只提供您需要的东西,仅此而已。但是,您始终可以扩展这些类以添加特定于您的项目的功能。

于 2013-10-17T04:19:17.790 回答