2016-04-11 14 views
0

Yeni oluşturulan belirli bir sınıfın her nesnesine, kopyalananlara değil, benzersiz bir kimlik atamak istediğimi varsayalım. Ben böyle bir şey için olabilir:std :: vektörü, başka bir sınıfın bir örneğine bağlı olarak belirli bir yapıcıyı çağırmak için nasıl zorlanır

int next_id = 0; // ugly global variable 

class Element { 
    int id; 
public: 
    Element(){ 
     this->id = next_id++; 
    } 
    Element(const Element &other){ 
     this->id = other.id; 
    } 
}; 

ve ben Ama bunun yerine genel değişken olmasının

vector<Element> list; 

yapabilirsiniz stl kütüphane ile çalışacak, başka bir nesnenin içine next_id olması gerekir:

Element *element = context->createElement(); 
:
class Context { 
    int next_id; 
public: 
    Element *createElement(){ 
     Element *element = new Element(this->next_id++); 
     return element; 
    } 
}; 

class Element { 
    int id; 
public: 
    Element(int id) : id(id) { 
    } 
    Element(const Element &other){ 
     this->id = other.id; 
    } 
}; 

Yani bu şekilde kullanabilir

Ama bunu vektörle kullanamıyorum.

std :: vector öğesinin yapıcısını

context->createElement()
gibi bir işlev aracılığıyla çağırmak istiyorum, yani 'context' nesnesine bağlı olarak bir şey ve yeniden boyutlandırırken normal kopya kurucuyu çağır.

Bunu yapmanın bir yolu var mı? Örneğin, bir functor örneğini vektöre veya başka bir şeye geçirerek? ...

DÜZENLEME: Bir noktayı açıklığa kavuşturmak için. Yeni bir context nesnesi oluşturarak ve daha sonra element s'yi bu yeni context ile ilişkilendirerek yeni bir kimlik dizisi oluşturabildiğim için başka bir Context sınıfının kullanılmasından bahsetmiştim. Örneğin eşdeğer sorunu bu gibi görünen bir Eleman sınıf var olacaktır:

class Element { 
    Context *context; 
public: 
    Element(Context *context) : context(context){ 
    } 
    Element(const Element &other){ 
     this->context = other.context; 
    } 
}; 

ve yapıcı çağırdığında vector bir context nesneyi belirtmek için bir yol aramaya.

+2

İlk örneğinizi tutun ve "next_id" öğesini "Element" öğesinin statik "haline getirin. – user657267

cevap

0

Gerçekten neden farklı bir sınıfta next_id olmasını istiyorsunuz. En basit çözüm next_idElement statik elemanının yapılmasıdır.

class Element { 
public: 
    Element(){ 
     this->id = next_id++; 
    } 
    Element(const Element &other){ 
     this->id = other.id; 
    } 
private: 
    int id; 
    static int next_id; 
}; 

int Element::next_id = 0; 

Bu, hile yapmalıdır. Saçma olduğunu düşündüğüm özel "alocator" a sahip olmanıza gerek yok.

Kimlikli hedefiniz, birden çok sınıfa sahip olmaksa, aralarındaki benzersiz kimlikle, kalıtım kullanın! Öğe, tüm alt sınıfların babası olacaktı ve tamamen benzersiz kimliğinizle ilgilenecekti.

+0

Sanırım benim örneğim yanıltıcıdır çünkü sorunum aslında benzersiz kimliklere sahip değildir. Kullanıcının yeni bir 'İçerik 'nesnesi oluşturarak yeni bir dizi diziye başlamasını istiyorum. Soruyu açıklığa kavuşturacağım. –

0

Standart kitaplık, öğelerini a.construct(p, args...) numaralı telefonu arayarak etkin bir şekilde yapılandırır. Buna karşılık, ovject'lerin nasıl oluşturulduğunu özelleştirmek için özel bir ayırıcının construct() üyesini kullanabilirsiniz. Bu yaklaşım, özel ayırıcının kullanılmasını gerektirir. Bu kullanım, ilgili sınıfın private sınıfının kurucuları yapılarak ve özel ayırıcı için yapım için bir yaklaşım sağlayarak zorlanabilir.

+0

ama ayırıcı bir sınıftır, vektörün deklarasyonunda belirticiye bir argüman iletmek mümkün mü? –

+0

@OnurCelebi: C++ 11 ayırıcıları durumsaldır, yani.Buradan gerekli içerik referans alınabilir ve ayrıştırıcı her yere aktarılır. –

+0

Bunlar, vektörün ömrü boyunca belirleyicidir, ancak vektörün beyanı sırasında onlara bir argüman iletmenin bir yolu var mıdır? –

İlgili konular