问题描述
我有以下类,其中有一个私有成员 vectortest
,我想将其用作类成员函数中操作的计算变量。然后,我将计算出的向量复制到另一个向量 cvectorin
,它是一个公共成员但一个常量,因此内容不能被修改,但可以访问。我尝试了以下操作(包括赋值和 std::copy):
class constVecTest
{
private:
vector<int> vectortest;
public:
constVecTest(vector<int> vin);
const vector<int> cvectorin;
vector<int> vectorin;
void vecop1();
void vecop2(vector<int> vin);
};
constVecTest::constVecTest(vector<int> vin)
{
vecop1();
vecop2(vin);
}
void constVecTest::vecop1()
{
vectortest = {1,1,1};
// cvectorin = vectortest;
copy(vectortest.begin(),vectortest.end(),back_inserter(cvectorin));
}
void constVecTest::vecop2(vector<int> vin)
{
vectortest = vin;
vectorin = vectortest;
}
int main()
{
vector<int> input {1,2,3,4,5},cvo,cvc;
constVecTest cvt(input);
cvo = cvt.vectorin;
cvc = cvt.cvectorin;
return 0;
}
但我收到错误:
error: passing ‘const std::vector<int>’ as ‘this’ argument discards qualifiers [-fpermissive]
我是向量的新手,在这种情况下找不到任何好的例子。我如何实现我想要的?如果上述方法不正确,我很乐意学习新的替代方法。
解决方法
如评论中所述,更好的方法是将您的 API 更改为如下所示:
class constVecTest
{
private:
vector<int> vectortest;
vector<int> cvectorin;
public:
constVecTest(vector<int> vin);
const vector<int> &get_cvectorin() const { return cvectorin; }
vector<int> vectorin;
void vecOp1();
void vecOp2(vector<int> vin);
};
现在公共访问是const,所以外部用户不能修改向量,但是你的私有成员可以自由修改它。
,const
成员在第一次创建后无法修改,即使从构造函数的主体中也是如此。
但是通过重新排列,您可以改变如何首次创建该成员:
class constVecTest
{
private:
vector<int> vectortest;
static vector<int> vecOp1();
public:
constVecTest(vector<int> vin);
const vector<int> cvectorin;
vector<int> vectorin;
void vecOp2(vector<int> vin);
};
constVecTest::constVecTest(vector<int> vin)
: vectortest(),// Create this one empty.
cvectorin(vecOp1()),// Create cvectorin from the result of vecOp1().
vectorin() // Another empty.
{
vecOp2(vin);
}
vector<int> constVecTest::vecOp1()
{
vector<int> result = {1,1,1};
return result;
}