2014-06-13 10 views
7

Şu an üzerinde çalıştığım C++ (çoğunlukla eğlence için) bir kütüphane yapıyorum (yıl, haha) Bu sadece bir hobi)Yapılandırılmamış bir kitaplığa dayanan bir const-correct (C++) kitaplığı oluşturma

Son zamanlarda bazı kütüphaneleri başka bir kütüphaneye (okuma, kütüphane bağımlılığı) değiştirdim. Ne yazık ki, söz konusu kütüphane 'const-correctness' ile hiç ilgilenmiyor. Ben biraz OKBim ve kendimi "The Right Way ™" yapmak için kendimi zorlamaktan hoşlanırım, bu yüzden kütüphanemde uydurma yapmak istiyorum. Bunu birkaç kez başlattım ve bazı bölümler; Baştan başa baştan başlamak için daha iyi olduğunu biliyorum, ama bu gerçekten alakalı ya da tartışmaya açık değil. Gerçek şu ki, onu tekrar kazanmak istiyorum, ama diğer kütüphane bunu yapmamı engelliyor.

Bunu biliyor musunuz?

Açıkça anlaşılması gereken bir yöntemi çağırıyorsam (aslında herhangi bir şeyi değiştirmiyor) ve yöntemim aynı zamanda bir inisiye (yeni sözcük) için bir adaysa, yapılamamdan emin değilim. Diğer yöntemin aynı zamanda aynı şekilde bir yöntem olduğunu.

Örnek:

// Bad third-party library 

struct Foo 
{ 
    void should_be_const() {} 
}; 

// My library 

struct Bar 
{ 
    Foo my_foo; 
    void should_be_const() const 
    { 
     my_foo.should_be_const(); // ERROR! Not a const function! 
    } 
}; 

Bu ampirik kanıtlardan ve const-lık hakkında benim araştırma ve anlayış beri bana sadece belirgindir. Bununla birlikte, bu yanlış bir şekilde oluşturulmuş bir anlayış olabilir, bu yüzden yanlış (ve umutlu) yanlış olduğunu ve başka bir şekilde gösterilmediğini (her ne kadar bu konuda bir anlayışa sahip olduğumu anladım)) eğer uygun bir kütüphane yazmak istiyorsa (ancak) bir bağımlılık bu şekilde yazılmıyorsa ne yapmalı?

Umarım bu, SO için uygun bir sorudur. Lütfen (eminim) emin değilseniz bana bildirin ya da yayınlamak için daha iyi bir StackExchange sitesi varsa.

P.S. Ben this SO question buldum, ama konu/çözüm üzerinde ayrıntılı olabilir umuyordum.

+0

Lütfen kötü tasarlanmış 3 parti kütüphane fonksiyonunun bir örneği ve kütüphanenizin bu kütüphane sınıfını nasıl kullandığını öğrenmek için bazı kodları gösteriniz – aschepler

+9

Bu, const_cast 'için bir nedendir. Eğer bir fonksiyonun gerçekten hiçbir şeyi değiştirmediğinden emin olabilirsiniz (ancak 'değişebilir' veri üyeleri) veya bir nesnenin const olarak tanımlanmadığını biliyorsanız, Evet, 'const_cast' tip sistemde bir delik açar, bu yüzden dikkatli kullanın – dyp

+0

@dyp bu benim' const_cast 'anlayışım, ama siz söylediğin gibi ... pek çok şeyin beyanını izleme gereği var mı? Her şey? Korumak için bir kâbus gibi geliyor ve hala _were_ 'const' olarak tanımlanan nesnelerin olduğu durumları çözememektedir. Kabul eder misin –

cevap

2

Başvuruda bulunduğunuz diğer soru, sorunların ne olduğu konusunda oldukça iyi bir yol gösteriyor, ancak yanıtla biraz katılmayacağım. Alt kütüphanelerinizdeki arayüzler dört vakaya ayrılacak.

  1. Sabit olmayan ve olması beklenmeyen şeyler.
  2. Öğeler düzgün const mantıksal const olmalıdır
  3. şeyler ve

    3a ilan etti. Bu şekilde uygulanır ancak bildirilmezler, bu nedenle bildirilmezler

    3b. Böyle

Durum 1 olarak uygulanmadı kolaydır - sen senin const olmasını istiyorsanız, o zaman bu arayüz çağırmadan önce girişlerin bir kopyasını yapmak gerekir. Bir oyuncu sadece yanlış olur ve sonunda bir çökme veya başka bir hataya neden olur. Durum 2 bir sorun değil. Yani vaka 3 öyle. Ne yazık ki, gerçek şu ki, 3a ve 3b vakaları, ayırt edilemedikleri için 1. duruma aynı şekilde muamele edilmelidir. Uygulama platform veya versiyona göre değişebilir. Yani, bir kopya oluşturmalı ve sonra arabirimi çağırmalısınız. Dikkat et dedim."Gerçek şu ki, çoğumuz anladığımızı düşündüğümüz ara yüzleri çağırmak için bir const_cast kullanacak (örneğin strcmp). Uygulamada ne kadar emin olduğumuza dair bir yargı çağrısı haline geliyor. Şahsen, strcmp hakkında endişelenmeyeceğim. herhangi bir üst seviye, strtok gibi şeyleri kırıp bir şeyleri kırıp geçirebilir

İlgili konular