[英]How to const_cast a vector of const pointers to a vector of non-const pointers?
[英]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_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);
並在測試中將input
和a
作為參數傳遞。
但是我在a.type() = somevalue;
上收到一條錯誤消息,提示“左值需要作為賦值的左操作數” a.type() = somevalue;
我認為是因為類ObjectA
有兩種type()
,一種是沒有const
的 setter ,一種是帶有const
的 getter 。 如果我將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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.