这是打字错误还是我漏了什么

is this a typo or am i missing something?

本文关键字:什么 错误      更新时间:2023-10-16

您好,我正在复习Bjarne Stroustrup的"C++编程语言",我面临着一段我认为应该是非法的代码片段,但它在文本中出现了。

我想知道这是否只是一个小小的疏忽,或者我是否遗漏了什么。

从第3章第63页开始:我们有如下用户定义的类型Vector:

class Vector {
    private:
    double* elem; // elem points to an array of sz doubles
    int sz;
    public:
    Vector(int s) :elem{new double[s]}, sz{s} // constructor: acquire resources
    {
            for (int i=0; i!=s; ++i) elem[i]=0; // initialize elements
    }
    Vector(std::initializer_list<double>)
    {
    // initialize with a list
    } 
    // ...
    void push_back(double)
    { 
    // add element at end increasing the size by one
    }
    ~Vector() {
     delete[] elem; 
     } // destructor: release resources
    double& operator[](int i);
    int size() const;
    };

注意Vector有两个构造函数,一个只有大小,另一个有一个完整的初始值设定项列表,看起来像{2.0,3.1,4}

现在我们继续定义一个名为"Container"的抽象类,它看起来像这样:

class Container {
    public:
    virtual double& operator[](int) = 0; // pure virtual function
    virtual int size() const = 0; // const member function (pure virtual) 
    virtual ~Container() {} // destructor 
    };

在这一点上,Bjarne希望通过定义一个继承自Container的具体类来证明Container的"抽象性",并碰巧使用Vector字段进行内部使用。在这里:

    class Vector_container : public Container { // Vector_container implements Container
            Vector v;
            public:
            Vector_container(int s) : v(s) { } // Vector of s elements
            ~Vector_container() {}
            double& operator[](int i) { return v[i]; }
            int size() const { return v.size(); }
      };

请注意,VectorContainer在内部使用Vector对象。这个类只有一个显式构造函数,它接受容器的大小(并使用该大小传入其内部Vector的构造函数)。

现在回想一下,Vector还有另一个形式的构造函数:Vector(std::initializer_list)

这一切都很好,但让我困惑的是,教科书继续呈现了这样的代码:

 void g()
 {
     Vector_container vc {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
     // use vc as a Container type
 }

正如您所看到的,vc是VectorContainer的一个实例,它正被传递一个初始值设定项列表给它的构造函数。这让我很困惑。在VectorContainer的定义中没有提到这样的构造函数。

我在这里错过了什么?感谢

也许是写书人的疏忽。不过,自己创建构造函数应该没有问题:

class Vector_container : public Container {
public:
    //...
    Vector_container( std::initializer_list< double> a)
        :v(a){
    }
    //...
}

你说得对,书上确实少了一些东西。