как привести константный вектор к неконстантному в C ++ - PullRequest
0 голосов
/ 21 февраля 2019

Я делаю гест.Функция, которую я хотел бы проверить, принимает два параметра.

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)) в качестве параметра.

Но я получаю сообщение об ошибке, говорящее "нет соответствующей функции".

Может кто-нибудь сказать мнекак я могу смоделировать 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 в качестве параметров в тесте.

но я получаю сообщение об ошибке "lvalue требуется в качестве левого операнда присваивания" на a.type() = somevalue;

Я думаю, это потому, что в классе ObjectA есть два type(), одинсеттер без const, один - геттер с const.Если я объявляю a как const, он считает, что type() является получателем, а не установщиком, поэтому он не может быть левосторонним значением.Вот почему я хочу использовать const_cast.

Теперь я сделал его скомпилированным без "const_cast" и указателей, как это было предложено в комментариях, но это не удалось "Исключение C ++ с описанием" const vector <...> :: at(позиция): недопустимая позиция «брошено в тестовое тело».Кто-нибудь знает что не так?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Использование const_cast совершенно не нужно и может быть удалено.С одной стороны, вы приводите неконстантные к неконстантным, что является избыточным.Кроме того, неконстантный объект может быть непосредственно назначен на ссылку const соответствующего типа, так что вам не нужно в любом случае приводить.Но, в случае input, вы даже не приводите его к совместимому типу, поэтому вы должны были получить ошибку компиляции в этом случае.

Что более важно, вы не выделяете фактический 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))
0 голосов
/ 21 февраля 2019

Забудьте о 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));

Гораздо проще.

...