如何将 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);
并在测试中将 input
和 a
作为参数传递。
但我在 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))
我正在做 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);
并在测试中将 input
和 a
作为参数传递。
但我在 a.type() = somevalue;
我觉得是因为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))