2010-02-04 9 views
5

İki DLL a.dll ve b.dll var ve her birinde bir sınıf AClass ve BClass var.
Ben Aclass ve BClass hem devralan ve saf soyut sınıftır aynı arayüz AbsBase uygulamak istiyoruz. Her bir sınıf olarak
I __declspec (DllImport) ve __declspect (dllexport) için # tanımlar ayarlayın. Ben derlemek çalışıyorum zaman bu olsun:Pure base sınıfının DLL'den dışa aktarılması gerekiyor mu?

uyarı C4275: sigara dll arayüzü sınıfı 'Aclass' dll-arabirim sınıfı için üs olarak kullanılan 'AbsBase' temelde __declspec olarak AbsBase ilan etmek istiyor

(dllexport)
Fakat derleyici bunu onun yolu olurdu, ben AbsBase beyan etmek zorunda kalacak a.dll ve B.dll hem ihraç edilecek.

Neden bir sınıfın arayüzü ihraç edilmesi gerekmektedir yapar?
Etrafında herhangi bir yolu var mı? AbsBase'i gerçekten her iki DLL'den de dışa aktarmalı mıyım? bunun doğal olarak yanlış bir tarafı yok mu? (Yeni XXX_EXPORT makro tanımlamak gerekir ..)

+0

Bir üçüncü DLL yapabilir miyim? – jmucchiello

+0

arayüzünüzü ve sınıf beyanlarınızı bize gösterir. –

cevap

3

Onun bir derleyici uyarısı değil bir hata gibi görünüyor, bu yüzden hala çalışması gerekir. Derleyici, sadece sizin için hata yapmanızı kolaylaştıran bir şey yaptığınızı bilmenizi sağlar. Hem DLL hem de temel program temel sınıfın tanımı üzerinde hemfikir olduğu sürece bunu yapmak kesinlikle kabul edilebilir olmalıdır.

Bu uyarıyı bastırmak için bir pragma kullanmak mümkün olmalıdır: Bu konuda üzülmeye şey

http://forums.devx.com/archive/index.php/t-84785.html

+1

Bu iş parçasındaki "ralph" yanıtı yanıyor. @OP: Temel sınıfınızın sonsuz soyut * kalması * şartıyla bu problemden bahsedeceksiniz. –

+0

Temel sınıfı tamamen saf sanal yapmak sorunu çözdü. – shoosh

0

bir uca sahiptir:

class Base { 
    public: 
    virtual void f() = 0; 
    virtual void g() = 0; 
    virtual ~Base(); 
}; 

class A: public Base { 
    public: 
    virtual void f(); 
    virtual void g(); 
}; 

class B: public Base { 
    public: 
    virtual void g(); // REVERSE ORDER 
    virtual void f(); 
}; 

sanal bir yöntem tabloda f ve g sırası temel sınıf belirtilen ve bu bilgi çok, bir gerekli.

+0

Evet, öyle. Bu yüzden başlık dosyasında. –

1

olduğunu. Derleyici, taban sınıftaki kodun çalışabileceğini tespit etti. Saf bir sanal yöntem olmayacak, bunları nasıl filtreleyeceğini biliyor. Belki bir kurucu veya yıkıcı? Hata modu, sınıf nesnesinin bellek düzeninin, istemci kodunda DLL ile aynı olmayabilir. Bu sebeple çalışma zamanı kargaşa teşhisi zor olan çok'dur. istemci ve DLL hem CRT ve bu araçları aynı sürümlerini kullanarak, tam olarak aynı derleme ve bağlantı ayarlarıyla derlenmektedir garanti gibi

sürece eğer tamam olacak. Temel sınıfı, sınıf yerine standart olmayan bir standart anahtar sözcüğü kullanarak özet garantili hale getirebilirsiniz.