Как использовать конструктор преобразования с указателями?

У меня есть класс C которые могут быть преобразованы в класс A и функция, которая принимает A* в качестве аргумента. Я хочу назвать это с C*, но я не могу заставить конструктор преобразования работать. Я получил: error: cannot convert ‘C*’ to ‘A*’ for argument ‘1’ to ‘void doSomething(A*)’, Что я делаю неправильно?

class C {
};

class A {
public:
A(C* obj) {}
};

void doSomething(A* object);

int main()
{
C* object = new C();
doSomething(object);
}

1

Решение

Конверсионные конструкторы можно определить только для пользовательские типы, в твоем случае A, Тем не менее, они не относятся к основные типы как указатели лайк A*,

Если doSomething брал A const& вместо (или просто A), тогда конструктор преобразования будет вызван, как вы ожидаете.

5

Другие решения

Если вашим основным требованием является возможность вызова существующей функции doSomething, то вы можете сделать это:

int main()
{
C* object = new C();
A a(object);
doSomething(&a);
// May need to delete object here -- depends on ownership semantics.
}
3

Вы, вероятно, имеете в виду, что вы хотите, чтобы C был подклассом A:

class C : public A {
...
};
0
По вопросам рекламы [email protected]