在 const 迭代器上调用成员函数

Calling member functions on const iterators

我有两个 class,一个 Measurement class 包含一个 vector<double> 和一个 Experiment 包含一个 vector<Measurement>:

class Measurement {

private:
    vector<double> dataSet;
    string time_stamp;  

public:
    const vector<double>& getDataSet() {return dataSet;}
    string getTimeStamp() {return time_stamp;}

};

class Experiment {

private: 
    vector<Measurement> measurements;

public:
    const vector<Measurement>& getMeasurements() {return measurements;}

};

简而言之,我试图遍历 Experiment(外循环)中的每个 Measurement,然后遍历每个 Measurement(内循环)中的数据。

我在 this thread 找到了一些帮助,这就是为什么成员函数 getDataSet()getMeasurements()const &(以使迭代器兼容)。

然而,当我尝试调用 iter_meas->getDataSet() 时,我 运行 遇到了麻烦。

int main() {


Experiment expTest(); // experiment already filled with measurements

vector<Measurement>::const_iterator iter_meas;
vector<double>::const_iterator iter_data;

for (iter_meas = expTest.getMeasurements().begin(); iter_meas != expTest.getMeasurements().end(); iter_meas++) {

    cout << iter_meas->getTimeStamp() << ',';   //this works fine :)

    for (iter_data = iter_meas->getDataSet().begin(); iter_data != iter_meas->getDataSet().end(); iter_data++){
        //              ^^^ here I get the error
        //              "the object has qualifiers that are not compatible with the member function getDataSet"
        //              "object type is const measurement"          
        cout << iter_data << ",";
    }
    cout << '\n';
}
return 0;
}

我理解 iter_meas 代表一个 const Measurement,但我不确定为什么我不能调用它的 Measurement:: 成员函数?

我正在使用 Visual Studio Community 2015。

表示函数returns const值,仅此而已

const int foo();

如果变量是const,则不能改变值,只能初始化。

所以如果你的程序中有 const 迭代器,它不能改变你的对象的值。与方法是一样的情况,它不能调用可能改变值的方法。

有解决办法。您必须将函数声明为 const(不返回 const 值)

int foo() const;

现在您可以从 const 迭代器调用此函数。 声明为:

const vector<Measurement>& getMeasurements() const {return measurements;}
const vector<double>& getDataSet() const {return dataSet;} // same problem

const_iterator iter_meas 表示对常量值 (const Measurement&) 的引用,并防止修改引用值。这特别意味着如果方法本身未声明为 const,则您不能对此类值调用非静态方法。这样的 const 声明表示该方法不会改变它的对象。

在您的代码中,您调用了 iter_meas->getDataSet(),其中此非静态方法声明为 const vector<double>& getDataSet(),即不是 const,而是声明为 const vector<double>& getDataSet() const .请注意声明末尾的 const

因此,通过以下更改,应该可以解决此问题:

const vector<double>& getDataSet() const {return dataSet;}
string getTimeStamp() const {return time_stamp;}

getDataSet 方法未标记为常量。由于您有方法返回对向量的 const 引用,因此方法本身需要是 const,即不允许向量发生变化。 因此,您的方法应声明为:

const vector<double>& getDataSet() const;

getMeasurements 相同。 此外,如果您使用的是 C++ 11,也许您想使用基于范围的 for 循环。