Temsilci oluşturucu kullanılırken üye başlatma


98

C ++ 11 standardını denemeye başladım ve bir init yöntemine veya benzerine sahip olmaktan kaçınmak için ctor'unuzu aynı sınıftaki başka bir ctor'dan nasıl çağıracağınızı açıklayan bu soruyu buldum . Şimdi aynı şeyi şuna benzeyen kodla deniyorum:

hpp:

class Tokenizer
{
public:
  Tokenizer();
  Tokenizer(std::stringstream *lines);
  virtual ~Tokenizer() {};
private:
  std::stringstream *lines;
};

cpp:

Tokenizer::Tokenizer()
  : expected('=')
{
}

Tokenizer::Tokenizer(std::stringstream *lines)
  : Tokenizer(),
    lines(lines)
{
}

Ama bu bana hatayı veriyor: In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegationTokenizer () kısmını listede ilk ve son olarak taşımayı denedim ama bu yardımcı olmadı.

Bunun arkasındaki sebep nedir ve bunu nasıl düzeltmeliyim? Onun yerine lines(lines)vücuda taşımayı denedim this->lines = lines;ve iyi çalışıyor. Ama başlatıcı listesini gerçekten kullanabilmeyi çok isterim.

Yanıtlar:


120

Üye başlatmayı başka bir kurucuya atadığınızda, diğer kurucunun nesneyi tüm üyeler dahil (yani , örneğinizdeki üye dahil) tamamen başlattığı varsayılır lines. Bu nedenle herhangi bir üyeyi yeniden başlatamazsınız.

Standarttan ilgili alıntı (vurgu benim):

(§12.6.2 / 6) Bir mem-başlatıcı-listesi, kurucunun sınıfının kendisini belirten herhangi bir sınıf veya decltype kullanarak kurucunun sınıfının başka bir yapıcısına delege edebilir. Bir mem-başlatıcı-kimliği kurucunun sınıfını belirlerse, bu tek mem-başlatıcı olacaktır ; yapıcı, temsilci bir kurucudur ve tarafından seçilen yapıcı, hedef oluşturucudur. [...]

İşe-etrafında bu argümanları alır yapıcı sürümünü tanımlayarak ilk :

Tokenizer::Tokenizer(std::stringstream *lines)
  : lines(lines)
{
}

ve ardından temsilci kullanarak varsayılan kurucuyu tanımlayın:

Tokenizer::Tokenizer()
  : Tokenizer(nullptr)
{
}

Genel bir kural olarak, kurucunun en fazla sayıda bağımsız değişken alan sürümünü tam olarak belirtmeniz ve ardından diğer sürümlerden (temsilde bağımsız değişken olarak istenen varsayılan değerleri kullanarak) yetki vermeniz gerekir.


2
İlk başta sezgisel görünmüyor ama gerçekten yardımcı oluyor!
Korchkidu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.