std::vector const 对象无法访问
std::vector inaccessibility with const onject
我试图重载直方图 class 的 << 运算符,其头文件是:
#ifndef HISTOGRAM_H
#define HISTOGRAM_H
#include<bits/stdc++.h>
class Histogram{
private:
std::vector<float> listOfElements;
std::vector<float> sortedListOfElements;
std::vector<float> bucketValues;
std::vector<float> bucketFrequencies;
int numberOfBuckets;
void setSortedListOfElements();
void setBucketValues();
void setBucketFrequencies();
public:
Histogram(std::vector<float>, int = 10);
Histogram(const Histogram &obj);
~Histogram();
std::vector<float> getListOfElements();
std::vector<float> getSortedListOfElements();
std::vector<float> getBucketValues();
std::vector<float> getBucketFrequencies();
friend ostream& operator<<(ostream &out, const Histogram &hs);
static float truncfn(float x);
};
这是我在 Histogram.cpp
中尝试过的
ostream & operator<< (ostream &out, const Histogram &hs){
out.precision(4);
out<<fixed;
int k;
vector<float>vals = hs.bucketValues;
vector<float>freq = hs.bucketFrequencies;
for(k = 0; k<10; k++){
out<<showpoint<<hs.truncfn(vals[k])<<",";
}
out<<showpoint<<hs.truncfn(vals[k])<<" ";
int j;
for(int j = 0; j < 9; j++){
out<<showpoint<<hs.truncfn(freq[j])<<",";
}
out<<showpoint<<hs.truncfn(freq[j]);
return out;
}
但是,bucketValues
和 bucketFrequencies
无法从此常量对象 hs 访问。我该如何解决这个问题?
我需要函数参数有一个常量,因为这个 << 运算符正在另一个 class 中使用,其中包含 Histogram
。
任何帮助将不胜感激:)
在提供的代码中,您没有在 header 中使用“using namespace std
”,这是正确的,因此 ostream
未定义(除非它成为以位为单位的全局命名空间,这会很糟糕)并且编译器可能会将两次出现的 ostream
视为不同的类型,因此在直方图 class 中声明的 friend operator<<
具有与函数 operator<<
在你的 cpp 文件中。尝试使用 std::ostream
,而不是。
您还可以通过不复制 operator<<
中的向量来改进代码 - 使用引用,或者更好的是,const 引用:
const vector<float>& vals = hs.bucketValues;
const vector<float>& freq = hs.bucketFrequencies;
我试图重载直方图 class 的 << 运算符,其头文件是:
#ifndef HISTOGRAM_H
#define HISTOGRAM_H
#include<bits/stdc++.h>
class Histogram{
private:
std::vector<float> listOfElements;
std::vector<float> sortedListOfElements;
std::vector<float> bucketValues;
std::vector<float> bucketFrequencies;
int numberOfBuckets;
void setSortedListOfElements();
void setBucketValues();
void setBucketFrequencies();
public:
Histogram(std::vector<float>, int = 10);
Histogram(const Histogram &obj);
~Histogram();
std::vector<float> getListOfElements();
std::vector<float> getSortedListOfElements();
std::vector<float> getBucketValues();
std::vector<float> getBucketFrequencies();
friend ostream& operator<<(ostream &out, const Histogram &hs);
static float truncfn(float x);
};
这是我在 Histogram.cpp
ostream & operator<< (ostream &out, const Histogram &hs){
out.precision(4);
out<<fixed;
int k;
vector<float>vals = hs.bucketValues;
vector<float>freq = hs.bucketFrequencies;
for(k = 0; k<10; k++){
out<<showpoint<<hs.truncfn(vals[k])<<",";
}
out<<showpoint<<hs.truncfn(vals[k])<<" ";
int j;
for(int j = 0; j < 9; j++){
out<<showpoint<<hs.truncfn(freq[j])<<",";
}
out<<showpoint<<hs.truncfn(freq[j]);
return out;
}
但是,bucketValues
和 bucketFrequencies
无法从此常量对象 hs 访问。我该如何解决这个问题?
我需要函数参数有一个常量,因为这个 << 运算符正在另一个 class 中使用,其中包含 Histogram
。
任何帮助将不胜感激:)
在提供的代码中,您没有在 header 中使用“using namespace std
”,这是正确的,因此 ostream
未定义(除非它成为以位为单位的全局命名空间,这会很糟糕)并且编译器可能会将两次出现的 ostream
视为不同的类型,因此在直方图 class 中声明的 friend operator<<
具有与函数 operator<<
在你的 cpp 文件中。尝试使用 std::ostream
,而不是。
您还可以通过不复制 operator<<
中的向量来改进代码 - 使用引用,或者更好的是,const 引用:
const vector<float>& vals = hs.bucketValues;
const vector<float>& freq = hs.bucketFrequencies;