2017-01-13 3 views
0

Я хочу сделать функцию, которая берет объект из ячейки вектора и изменяет его. Сначала мне нужно передать эту ячейку по ссылке на функцию, и я не могу этого сделать.Как передать векторную клетку функции в C++?

void circleChoiceOne(Circle& object); 
vector<Shape*> shapeArr; 
int main() 
{ 
    circleChoiceOne(shapeArr[choice]); 
    return 0; 
    system("PAUSE"); 
} 

Я получаю ошибка направлена ​​на линию 7, и он говорит: Ссылка типа Circle & не может быть инициализирована со значением типа Shape *.

ответ

1

Вы не можете инициализировать ссылку указателем (если это не ссылка на указатель, конечно) - точно, что говорит компилятор. Либо замените подпись функции на прием указателя, либо вызовите функцию с разыменованным объектом, либо сохраните std::ref в контейнере. Это делается в предположении, что Shape является потомком Circle (что немного bizzare).

Пример:

void circleChoiceOne(Circle* object); 

Или

circleChoiceOne(*shapeArr[choice]); 

Или

vector<std::ref<Shape>> shapeArr; 
+0

Это не работает, он говорит: «нет подходящей функции преобразования из "Shape", чтобы "Круг *" существует –

3

shapeArr[choice] будет возвращать Shape* но метод ожидает Circle&.

Я предполагаю, что Circle является подклассом Shape.

Вам нужно будет dynamic_cast на обратное приведение в Shape* к Circle*, то вы хотите разыменования указателя на значение, так что вы можете передать его по ссылке.

Вам нужно будет проверить, что Shape* фактически указывает на Circle (в отличие от Rectangle или Torus) перед заливкой и обрабатывать случай, когда он не делает.

+0

Я пытаюсь динамическое литье: "shapeArr [выбор] = dynamic_cast (* Circle);" Но он говорит о «Circle» - имя типа не разрешено. –

+0

@YazenVid. Ваш вопрос и мой ответ касаются доступа к элементу из вашего «вектора», не присваивания ему. Также этот код в вашем комментарии не будет компилироваться, потому что «Круг» 'является типом, а не переменной. – Dai

 Смежные вопросы

  • Нет связанных вопросов^_^