簡體   English   中英

如何將常量向量轉換為非常量

[英]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);

並在測試中將inputa作為參數傳遞。

但是我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM