Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将asString()/toString()添加到std::vector?_C++_Inheritance_Stl - Fatal编程技术网

C++ 如何将asString()/toString()添加到std::vector?

C++ 如何将asString()/toString()添加到std::vector?,c++,inheritance,stl,C++,Inheritance,Stl,我的情况如下:有一个类MyList可能会在以后得到具体的实现。目前,像std::vector这样的行为还可以 然而,我确实需要一种简单的方法来对其调用某种类型的asString()/toString()方法,因为在测试断言、调试输出等中需要它。我看到的唯一选择是: 公共继承。我永远不会通过基指针删除这样的列表,因为不应该有任何基指针。如果我这样做,无论如何,将不会有指针成员。然而,经验法则仍然规定:不要从stl容器继承 某种“全局”(当然是在名称空间中)方法,它将MyList的一个实例作为参数,

我的情况如下:有一个类MyList可能会在以后得到具体的实现。目前,像std::vector这样的行为还可以

然而,我确实需要一种简单的方法来对其调用某种类型的asString()/toString()方法,因为在测试断言、调试输出等中需要它。我看到的唯一选择是:

  • 公共继承。我永远不会通过基指针删除这样的列表,因为不应该有任何基指针。如果我这样做,无论如何,将不会有指针成员。然而,经验法则仍然规定:不要从stl容器继承

  • 某种“全局”(当然是在名称空间中)方法,它将MyList的一个实例作为参数,并为我执行asString()魔术。在这种情况下,MyList可以是std::vector的简单类型定义


  • 这两种选择我都不太喜欢。还有什么我没想到的吗?或者如果不是,我应该选择哪种方式?

    为什么调试和断言方法不为您这样做?

    为什么调试和断言方法不为您这样做?

    第二种方法有什么错?这是迄今为止最简单的,也是相当优雅的- 想象一下包装向量的替代方案。这将给您带来大量额外的工作,并粘合容易出错的代码!我肯定会使用函数方法

    编辑:顺便说一句,我几乎完全使用自由函数(有时是静态成员)进行转换。想象一下,您有一大堆需要转换为字符串的类型。将toString()函数作为自由函数而不是成员不会让您感到头痛,因为您基本上可以随意重载函数,而不必接触任何现有类(或者您甚至没有源代码访问权限的类)

    然后您可以使用如下函数:

    template<class T>
    void printDebugInfo(const T & _obj)
    {
       std::cout<<toString(_obj)<<std::endl;
    }
    
    模板
    无效printDebugInfo(常量T和对象)
    {
    
    std::cout第二种方法有什么不对?这是迄今为止最简单的方法,也是相当优雅的方法- 想象一下包装向量的替代方案。这会给你带来大量额外的工作,并粘合容易出错的代码!我肯定会使用函数方法

    编辑:顺便说一句,我几乎只使用自由函数(有时是静态成员)进行转换。想象一下,您有一大堆类型需要转换为字符串作为自由函数而不是成员的函数不会让您感到头痛,因为您基本上可以随意重载函数,而不必接触任何现有类(或者您甚至没有源代码访问权限的类)

    然后您可以使用如下函数:

    template<class T>
    void printDebugInfo(const T & _obj)
    {
       std::cout<<toString(_obj)<<std::endl;
    }
    
    模板
    无效printDebugInfo(常量T和对象)
    {
    
    std::cout您是否考虑过组合,而不是继承?即您的
    MyList
    具有类型为
    std::vector
    的成员变量


    您可能会抱怨现在需要在
    MyList
    中复制
    std::vector
    的API。但是您说您可能会在以后更改实现,所以无论如何您都需要这样做。您也可以直接这样做,以避免以后不得不更改所有客户端代码。

    您是否考虑过组合,以及操作设置为继承?即,您的
    MyList
    具有类型为
    std::vector
    的成员变量


    您可能会抱怨现在需要在
    MyList
    中复制
    std::vector
    的API。但是您说以后可能会更改实现,所以无论如何都需要这样做。您也可以直接这样做,以避免以后必须更改所有客户端代码。

    实际上,在ty类上释放函数PES是一种标准的技术,被认为是一种类型的接口的一部分,由C++语言标准的人萨特(H.P.)阅读。

    一般来说,喜欢自由函数而不是成员函数。这增加了封装和重用性,减少了类的膨胀。Scott Meyers可以看到更深层的信息(对于你的C++书籍,如果你想提高C++的有效和干净的使用,你应该明确阅读)。


    也注意到,你不应该从STL容器中派生出来。它们不是被设计为基类,你可以很容易地调用未定义的行为。但是,参见.P/>P>实际上,类函数的自由函数是一种标准的技术,被认为是C++接口的一部分。标准化

    一般来说,喜欢自由函数而不是成员函数。这增加了封装和重用性,减少了类的膨胀。Scott Meyers可以看到更深层的信息(对于你的C++书籍,如果你想提高C++的有效和干净的使用,你应该明确阅读)。


    还请注意,您永远不应该从STL容器派生。它们不是设计为基类的,您可能很容易调用未定义的行为。但是请参见。

    在这种情况下,继承是完全错误的

    全局函数方法非常好


    < > C++中的“方法”之一是过载<代码>运算符> P>继承在这种情况下完全错误。 全局函数方法非常好

    < C++中的一个方法是超载<代码>运算符> P>我认为有一个免费的

    std::string toString( const MyList &l );
    

    函数非常好。如果你害怕名字冲突,你可以考虑你所说的命名空间。这个函数是高度解耦的,并且不能修补<代码> MyList对象的私有成员(如成员或朋友函数的情况)。

    唯一可以证明它不是免费函数的原因是:您注意到,为了能够实现
    toStrin,您突然需要大量扩展MyList的公共接口