0

我有两个类,一个Measurement包含 a的类vector<double>和一个Experiment包含 a 的类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;}

};

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

我在这个线程上找到了一些帮助,这就是为什么成员函数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代表 a const Measurement,但我不确定为什么我不能Measurement::在它上面调用成员函数?

我正在使用 Visual Studio 社区 2015。

4

3 回答 3

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
于 2017-05-07T18:26:55.670 回答
0

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

在您的代码中,您调用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;}
于 2017-05-07T18:44:21.483 回答
0

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

const vector<double>& getDataSet() const;

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

于 2017-05-07T21:51:11.243 回答