Я хотел бы пометить класс как устаревший с использованием C ++ 98 и компилятора g ++, чтобы получить предупреждение, когда этот класс используется напрямую или когда кто-то наследует этот класс.
Видимо, используя __attribute__ ((__deprecated__))
работает, когда класс используется, но не для наследования.
Например:
#if defined(__GNUC__)
# define DEPRECATED __attribute__ ((__deprecated__))
#else
# define DEPRECATED
#endifclass DEPRECATED Foo
{
public:
explicit Foo(int foo) : m_foo(foo) {}
virtual ~Foo() {}
virtual int get() { return m_foo; }
private:
int m_foo;
};class Bar : public Foo // This declaration does not produce a compiler
// warning.
{
public:
explicit Bar(int bar) : Foo(bar), m_bar(bar) {}
virtual ~Bar() {}
virtual int get() { return m_bar; }
private:
int m_bar;
};
int main(int argc, char *argv[])
{
Foo f(0); // This declaration produces a warning.
Bar b(0); // This declaration does not produce a warning.
return b.get();
}
Я ожидаю получить предупреждение от «класса Bar: public Foo», но это не так (протестировано с g ++ 5.2.1).
Есть ли способ получить предупреждение при выводе из устаревшего класса?
Простейший способ обойти это — вместо того, чтобы фактически пометить этот класс как устаревший, создать закрытый класс этого класса, который помечен как устаревший, и который он создает как временную переменную в своем конструкторе. Таким образом, вы все равно получите предупреждение об устаревании, если создадите экземпляр производного класса.
class base {
class DEPRECATED deprecator {};
public:
base() {
deprecator issue_warning;
(void) issue_warning; // this line is no-op to silence unused variable warning for local variable
}
};
class derived : public base {
public:
derived()
: base()
{
// I am also deprecated, because I called the ctor for base
// which instantiates a deprecated class
}
};
Это может быть более сложным для реализации, если base
имеет много разных конструкторов, но это по крайней мере дает идею. Вообще всякий раз, когда экземпляр derived
построен, экземпляр base
должен быть построен — один из базовых ctors должен работать до завершения до времени жизни derived
экземпляр может начаться.