"Güvenli olmayan sanal işlev" ile, tanı amaçlı olarak ayrıca uygulamaları olan (http://www.gotw.ca/gotw/031.htm numaralı belgede açıklandığı gibi) saf sanal işlevleri kastediyorum.Bu, kusurlu sanal işlevleri uygulamak için yasal bir yol mu?
bunları uygulamak için koşer yolu yapmaktır:
class Foo
{
public:
...
virtual void Bar() = 0;
};
void Foo::Bar() { assert(false); }
Ama bu sınıf saf sanal yöntemlerin bir numarası vardır özellikle, biraz can sıkıcı. Ayrıca, birisinin yanlışlıkla karşılık gelen bir uygulama eklemeden yanlışlıkla yeni bir sanal işlev eklemediğinden emin olmak zor.
class Foo
{
public:
...
virtual void Bar() = 0
{
assert(false);
}
};
ama C++ standardı açıkça (ISO C++ 2003 standardında bölüm 10.4/2) Bu izin vermiyor:
İdeal ne yapmak istiyorum olduğunu.
Alternatif olarak, aşağıdaki kesmeyi düşündüm. İlgili Foo.cpp
kaynak dosyada sonra
#ifndef ABSTRACT_METHOD
#define ABSTRACT_METHOD = 0
#endif
class Foo
{
public:
...
virtual void Bar() ABSTRACT_METHOD;
};
ve: tek derlenmiş uygulamasını alır böylece
#define ABSTRACT_METHOD { assert(false); }
#include "Foo.h"
...
Foo.h
başlığında.
Yasal mıdır?
Eh, kaynak dosyada bir sahte '' 'olurdu ... –
@Oli Charlesworth: Doğru, ama bunun doğal olarak yanlış bir şey var mı? Makro tanımına ''' takibi için sorumluluk taşıyarak kolayca önlenebilir. – jamesdlin
@james: Evet, bunun bir derleyici hatası olacağına inanıyorum. Bildiğim kadarıyla tamir edilebilir olduğunu biliyorum, ama bu bir tesadüfi gözlemdi, bir eleştiri değil ... –