işaretine başvuru yapmak için temel sınıfın atamasını belirleme Şu anda polimorfik türler ve atama işlemleri arasındaki etkileşimi araştırıyorum. Benim asıl kaygım, birisinin bir temel sınıfın değerini türetilmiş bir sınıfın nesnesine tahsis etmeyi deneyip deneyemeyeceği, bu da sorunlara yol açıp açmayacağıdır.Türetilmiş sınıf
this answer'dan itibaren Temel sınıfın atama operatörü her zaman türetilen sınıfın örtük olarak tanımlanmış görev operatörü tarafından gizlendiğini öğrendim. Dolayısıyla, basit bir değişkene atanmak için yanlış tipler derleyici hatalarına neden olur.
class A { public: int a; };
class B : public A { public: int b; };
int main() {
A a; a.a = 1;
B b; b.a = 2; b.b = 3;
// b = a; // good: won't compile
A& c = b;
c = a; // bad: inconcistent assignment
return b.a*10 + b.b; // returns 13
}
atama Bu form muhtemelen nesne durumuna inconcistent yol açacak
Ancak hiçbir derleyici uyarısı yoktur ve kod ilk başta bana olmayan kötülük görünür: atama referans yoluyla oluşursa, ancak bu doğru değildir bakışta.
tür sorunları tespit etmek herhangi kurulan deyim var mı?
Ben böyle geçersiz atama bulursam ben sadece bir istisna atma, çalışma zamanı tespiti için umut sanırım. Şu anda düşünebildiğim en iyi yaklaşım, temel sınıftaki kullanıcı tanımlı bir yardımcı operatördür. Bu, this
'un aslında türetilmiş bir sınıf için değil, bir temel örneğinin işaretçisi olduğundan emin olmak için çalışma zamanı türü bilgisini kullanır. el ile üye üye kopyası yapar. Bu, çok fazla yüke ve ciddi şekilde okunabilir kod okunabilirliğine benziyor. Daha kolay bir şey var mı?
Düzenleme: Bazı yaklaşımların uygulanabilirliği ben ne yapmak istediğinize bağlı gibi görünüyor beri, burada bazı detaylar. İki matematiksel kavramları, var
ring ve field söylerler. Her alan bir halkadır, ancak tersi değildir. Her biri için birkaç uygulama vardır ve bunlar ortak temel sınıfları, yani AbstractRing
ve AbstractField
'u paylaşırlar. Şimdi std::shared_ptr
'a dayanarak kolay-yazımlı referans anlamlarını uygulamaya çalışıyorum. Bu yüzden benim Ring
sınıfım, uygulamayı sürdüren bir std::shared_ptr<AbstractRing>
ve buna yönlendiren bir grup yöntem içeriyor. Field
'u Ring
'dan devralmak için yazmak istiyorum, bu yüzden bu yöntemleri tekrarlamak zorunda kalmam. Bir alana özgü yöntemler, işaretçiyi AbstractField
'a çevirirdi ve bunu statik olarak yapmak istiyorum. Ben işaretçi aslında inşaat bir AbstractField
olduğunu garanti edebiliyor, ama birinin bu nedenle benim varsayılır değişmeyen hakkında içerdiği paylaşılan işaretçi kırarak, aslında bir Field
bir Ring&
bir Ring
atar endişeliyim.
Buradaki gerçek sorun, soyut olmayan bir temel sınıfınız yok mu? –
Şahsen ben polimorfik türler için kopya oluşturucu ve atama işleçleri devre dışı bırakıyorum. Kalıtım tabanı polimorfizmi gerçekten değer tipleri ile iyi oynamamaktadır. –
@OliCharlesworth: Nasıl görmüyorum. Örn. Bir düğmeden türetilen bir geçiş butonu, temel sınıfın somutlaşabileceği ve sorunun gerçek dünyada ortaya çıkabileceği durumları görebiliyorum. Bu nedenle, “tüm üslerin soyut olması” yaklaşımını takip etmem. Bu aklınızdaki gibi değilse, lütfen soyut temel sınıflarının durumumla nasıl yardımcı olabileceğini açıklayınız. – MvG