【问题标题】:Calling member functions on const iterators在 const 迭代器上调用成员函数
【发布时间】:2017-10-05 16:57:53
【问题描述】:

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

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 &amp;(以使迭代器兼容)。

但是,当我尝试拨打iter_meas-&gt;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。

【问题讨论】:

  • 你已经声明了他们的返回类型为const,但这并没有说明成员相对于this的常量性。你需要getMeasurements() const {return measurements;}

标签: c++ class vector constants const-iterator


【解决方案1】:

表示函数返回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

【讨论】:

  • 是的,我忘了更新头文件的名称。非常感谢您的清晰解释,它现在正在工作:)
【解决方案2】:

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

在您的代码中,您调用iter_meas-&gt;getDataSet(),此非静态方法被声明为const vector&lt;double&gt;&amp; getDataSet(),即不是const,后者将被声明为const vector&lt;double&gt;&amp; getDataSet() const。注意声明末尾的const

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

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

【讨论】:

    【解决方案3】:

    getDataSet 方法未标记为 const。由于您有方法返回对向量的 const 引用,因此方法本身必须是 const,即不允许向量的突变。 所以,你的方法应该声明为:

    const vector&lt;double&gt;&amp; getDataSet() const;

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

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 2011-06-04
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2021-07-12
      • 2017-07-17
      相关资源
      最近更新 更多