SORU
23 EYLÜL 2008, Salı


Nasıl benzer sabit olmayan sabit üye işlev arasında kod tekrarından kaldırabilirim?

Diyelim erişim dahili üye dönmek istiyorum: class X şu var ki

class Z
{
    // details
};

class X
{
    std::vector<Z> vecZ;

public:
    Z& Z(size_t index)
    {
        // massive amounts of code for validating index

        Z& ret = vecZ[index];

        // even more code for determining that the Z instance
        // at index is *exactly* the right sort of Z (a process
        // which involves calculating leap years in which
        // religious holidays fall on Tuesdays for
        // the next thousand years or so)

        return ret;
    }
    const Z& Z(size_t index) const
    {
        // identical to non-const X::Z(), except printed in
        // a lighter shade of gray since
        // we're running low on toner by this point
    }
};

İki üye işlevleri X::Z() X::Z() const parantez içinde aynı kod var. Bu kuralların ihlalive karmaşık mantık ile uzun fonksiyonlar için bakım sorunlarına neden olabilir.

Bir şekilde bu kod tekrarından kaçınmak için var mı?

CEVAP
23 EYLÜL 2008, Salı


Ayrıntılı bir açıklama için, lütfen "const Tekrarından Kaçınmak ve-const Olmayan Üye İşlev," p. başlığa bakın Madde 3 mümkün olduğunca "const". 23, ^em>Etkili C3d Scott Meyers tarafından ed, ISBN-13: 9780321334879.

alt text

İşte Meyers'in çözümü (basit):

struct C {
  const char & get() const {
    return c;
  }
  char & get() {
    return const_cast<char &>(static_cast<const C &>(*this).get());
  }
  char c;
};

İki atmalarını ve işlev çağrısı çirkin olabilir ama doğru. Meyers neden ayrıntılı bir açıklama vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GoldgenieOfficial

    GoldgenieOff

    23 Temmuz 2009
  • jbignacio

    jbignacio

    13 Mart 2006
  • Perihelion

    Perihelion

    23 NİSAN 2008