在 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 循环。
我有两个 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 循环。