Я пытаюсь сделать что-то вроде этого, и я получаю сообщение об ошибке:
class A {
public:
explicit A();
}
A * a = new A(); //results in: undefined reference to A()
Я также попробовал:
A * a = A(); //results in cannot convert A to A * in assignment
Есть ли способ сделать это? Я был бы очень признателен за помощь.
В первом случае проблема не связана с тем, что конструктор explicit
, но с тем, что вы это объявили, а не определили. То, что вы получаете, является ошибкой от линкер, не из компилятора. Попробуй это:
class A {
public:
explicit A() { /* Or anything more meaningful than just doing nothing */ }
};
Во втором случае это не сработает. Во-первых, потому что вы пытаетесь инициализировать указатель (т.е. переменную типа A*
) из объекта типа A
, Во-вторых, потому что даже если вы сделали немного более значимым:
A a = A();
Это не скомпилируется, потому что explicit
конструкторы не рассматриваются для копия инициализация (форма инициализации, которая использует =
знак).
Вы не предоставляете тело конструктора. Пытаться:
class A {
public:
explicit A() {}
}
explicit
Ключевое слово просто означает, что оно предотвращает преобразования типов, о чем говорит вторая ошибка.