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

时间:2019-02-20 22:18:26

标签: c++ googletest

我正在做一个gtest。我要测试的功能需要两个参数。

a = np.zeros((6,6))
for i in range(6):
    for j in range(6):
        a[i,j] = 10*i + j
print(a)

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

对于int functionA(const ObjectA& obja, const stl::vector<ObjectB>& objb) ,我所做的是:

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))并将其传递给gtest吗?

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

input

我还尝试过不使用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); input作为参数传递给测试。

但是我在a上看到一条错误消息:“需要左值作为赋值的左操作数”

我认为这是因为类a.type() = somevalue;中有两个type(),一个是没有ObjectA的二传手,一个是带有const的消气剂。如果我将const声明为a,则它认为const是getter而不是setter,因此它不能是左侧值。这就是为什么我要使用type()

现在,我将其编译为没有注释建议的“ const_cast”和指针,但是它在测试体内抛出了“ C ++异常,描述为” const vector <...> :: at(position):invalid position“。 ”有人知道哪里出问题了吗?

2 个答案:

答案 0 :(得分: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));

容易得多。

答案 1 :(得分:0)

您完全不需要使用const_cast,可以将其删除。一方面,您将非常量转换为非常量,这是多余的。但是,也可以将非常量对象直接分配给匹配类型的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))