使用。访问类数组元素。用C ++或Stroustrup中的错误书

时间:2017-04-17 12:11:22

标签: c++

在B. Stroustrup的“使用C ++编程原理和实践”一书中,我遇到了一段代码,其中参数是向量类的基本版本的数组。该类定义为

class vector {
    int sz;
    double * elem;
public:
    vector(const vector &);
    //...
};
//...
vector::vector(const vector &arg)
     :sz{arg.sz},elem{new double[arg.sz]}
{
     copy(arg.elem,arg.elem.sz,elem);
}

我的问题:是' arg.elem.sz'一个有效的表达?如果是,这访问是什么?

(顺便说一下,我试着编写一段简单的代码来试试这个,但是我得到了一个错误。由于arg.elem是一个指针,它希望我做一些更像是' arg。 elem->&#39)

谢谢!

EDIT / UPDATE:语法似乎是正确的。看一下copy的定义,这个参数是一个' iterator'。我怀疑必须有一些关于将参数转换为迭代器类型的东西,然后获取第s个指向的元素变得访问迭代器的元素?澄清欢迎:))

2 个答案:

答案 0 :(得分:5)

这只是一个错字,arg.elem.sz不是有效的表达式,因为arg.elemdouble*,没有成员可以访问(也没有-> opertor )。它应该是arg.elem + arg.sz,因为这是std::copy的工作方式。

在您的更新中,您询问了迭代器std::copy算法。 std::copyfunction template,如果它们满足input iteratoroutput iterator的要求,则接受任何类型作为输入和输出迭代器。指向数组元素的指针满足上述要求,因此arg.elem作为double*可以用作迭代器。

如果我们将疑问代码行更改为以下代码,那么这将是有道理的:

copy(arg.elem, arg.elem + arg.sz, elem);

上面的代码会将arg.elemarg.elem + arg.sz之间的数组内容复制到elem指向的数组。

答案 1 :(得分:0)

尝试编译(使用myvector而不是vector来防止与标准向量的冲突)使用gcc获取:

c++ -std=c++11 -o a a.cpp
a.cpp: In copy constructor ‘myvector::myvector(const myvector&)’:
a.cpp:24:26: error: request for member ‘sz’ in ‘arg.myvector::elem’, which is 
of non-class type ‘double* const’
  copy(arg.elem, arg.elem.sz, elem);
                      ^

我怀疑勘误需要修复为+ sz而不是