如何在c ++中将const向量转换为非const

问题描述 投票:-1回答:2

我正在做一个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))作为参数。

但是我收到一条错误消息,说“没有匹配的功能”。

谁能告诉我如何模仿input并将其传递给gtest?

为方便起见,gtest中的代码是(假设类名是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;上收到一条错误,说“左手操作数需要左值”

我认为这是因为在type()类中有两个ObjectA,一个是没有const的二传手,一个是const的吸气剂。如果我将a声明为const,它认为type()是getter而不是setter,因此它不能是左侧值。这就是我想使用const_cast的原因。

现在我编译它没有“const_cast”和指针作为注释建议,但它失败了“C ++异常与描述”const vector <...> :: at(position):无效位置“抛出测试体”。有谁知道什么是错的?

c++ googletest
2个回答
1
投票

忘记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));

更容易。


0
投票

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

更重要的是,您没有为stl::vector分配实际的input对象,因此当您尝试取消引用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))
© www.soinside.com 2019 - 2024. All rights reserved.