如何将 const 向量转换为非常量

how to cast const vector to non-const

我正在做 gtest。我想测试的函数有两个参数。

int functionA(const ObjectA& obja, const stl::vector<ObjectB>& objb)

在我的 gtest 中,我想模拟一些测试用例。

对于obja,我做的是:

ObjectA* obja = new ObjectA();
obja->type() = someValue; //setter function
obja->value() = someValue; // setter too

然后传递*(const_cast<ObjectA*>(obja))作为参数。

但是对于矢量,我不确定const定义了什么。我试过了:

stl::vector<ObjectB*>*  input;
ObjectB objb = new ObjectB();
objb->type() = someValue // setter
objb->id() = someValue//setter
input.push_back(objb);

然后传递*(const_cast<ObjectB*>(input))作为参数。

但是我收到一条错误消息说 "no matching function"。

谁能告诉我如何模拟 input 并在 gtest 中传递它?

为了方便起见,gtest中的代码是(假设class名字是A):

ObjectA* obja = new ObjectA();
obja->type() = someValue; //setter function
obja->value() = someValue; // setter too

stl::vector<ObjectB*>*  input;
ObjectB objb = new ObjectB();
objb->type() = someValue // setter
objb->id() = someValue//setter
input.push_back(objb);

A* instanceA = A::getInstance();
EXPECT_EQ(-2, instanceA->functionA(*(const_cast<ObjectA*>(obja)),*(const_cast<ObjectB*>(input)))) ;

我也试过不使用 const_cast 和指针,我试过:

const ObjectA a;
a.type() = somevalue;
a.value() = somevalue;

const stl::vector<ObjectB> input;
ObjectB objb;
objb.type() = some;
input.push_back(objb);

并在测试中将 inputa 作为参数传递。

但我在 a.type() = somevalue;

上收到一条错误消息 "lvalue required as left operand of assignment"

我觉得是因为class里面有两个type()ObjectA,一个是setter没有const,一个是getter 和 const。如果我将 a 声明为 const,它认为 type() 是 getter 而不是 setter,因此它不能是左侧值。这就是为什么我要使用 const_cast.

忘记 const,这不是问题,问题是指针的不必要且有时不正确的使用。

查看您正在测试的函数的声明。

int functionA(const ObjectA& obja, const stl::vector<ObjectB>& objb)

那里没有指针。现在查看您要传递给函数的向量的声明。

stl::vector<ObjectB*>*  input;

那是(指向)指针向量的指针,这就是代码不起作用的原因。测试函数向量不是指针向量。下面是如何在没有任何指针的情况下编写代码

ObjectA obja;
obja.type() = someValue; //setter function
obja.value() = someValue; // setter too

stl::vector<ObjectB> input;
ObjectB objb;
objb.type() = someValue // setter
objb.id() = someValue//setter
input.push_back(objb);

A* instanceA = A::getInstance();
EXPECT_EQ(-2, instanceA->functionA(obja, input));

容易多了。

您对 const_cast 的使用完全没有必要,可以将其删除。一方面,您将非常量转换为非常量,这是多余的。而且,可以将非常量对象直接分配给匹配类型的 const 引用,因此您不需要强制转换。但是,在 input 的情况下,您甚至没有将其转换为兼容类型,因此您应该在该 cas 上遇到编译器错误。

更重要的是,您没有为 input 分配一个实际的 stl::vector 对象来指向,因此当您尝试取消引用时,您有 未定义的行为 input.

试试这个:

ObjectA *obja = new ObjectA();
obja->type() = someValue; //setter function
obja->value() = someValue; // setter too

stl::vector<ObjectB*> *input = new stl::vector<ObjectB*>();
ObjectB objb = new ObjectB();
objb->type() = someValue // setter
objb->id() = someValue//setter
input->push_back(objb);

A *instanceA = A::getInstance();
EXPECT_EQ(-2, instanceA->functionA(*obja, *input))

如果你摆脱对 new 的所有使用,这可以简化:

ObjectA obja;
obja.type() = someValue; //setter function
obja.value() = someValue; // setter too

stl::vector<ObjectB*> input;
ObjectB objb;
objb.type() = someValue // setter
objb.id() = someValue//setter
input.push_back(&objb);

A *instanceA = A::getInstance();
EXPECT_EQ(-2, instanceA->functionA(obja, input))