2016-04-09 18 views
-1

C++ 'ya yeniyim ve biraz yardım isterim.C++ 'da, bir ana sınıftan miras alınan bir dizi nesne nasıl oluşturulur?

Ben nesneleri dizisini oluşturmak gerekiyor ve ben anladım kadarıyla, o kullanılarak yapılır:

MyObject* instance = new MyObject[nb_of_instances_in_array]; 

olsa da, oldukça ihtiyaçlarımı uymuyor.

Farklı yöntem ve özelliklerden başka 3 nesneyi miras alan bir ana nesnem var.

mainObject < - Object1

mainObject < - Object2 < - Object3

Şimdi Object1s, Object2s ve Object3s içerebilen bir dizi oluşturmak istiyorum. Ben böyle bir şey yaptığını çalıştı:

int nb_of_obj, i; 
cin >> nb_of_obj; 
mainObject* arrayOfMainObjects = new mainObject[nb_of_obj]; 
for(i = 0;i<nb_of_obj;i++) 
{ 
//Menu to select Object to append to the array 
arrayOfMainObjects[i] = Object2(args...);\\there are between 3 and 5 args for each object 
} 
delete arrayOfMainObjects; 

ve ben de Stdlib.h en malloc ve ücretsiz kullanarak daha fazla C odaklı yöntem denedik.

*(arrayOfMainObjects + i*max_size()) = Object2(args...); 

yerine:

arrayOfMainObjects[i] = Object2(args...); 

using namespace std; 

size_t max_size(); 
    return (size_t)(max(max(sizeof(Object1),sizeof(Object2)), max(sizeof(Object3), sizeof(mainObject)))); 

mainObject* arrayOfMainObjects = NULL; 
arrayOfMainObjects = (mainObject*) malloc(nb_of_obj*max_size()); 
//Globally, same code than above 
free(arrayOfMainObjects); 

ben yanlış yapıyorum bilmiyorum, ben bile böyle bir şey dizideki "nokta" Önümüzdeki erişen yapıyor çalıştı

+0

Bize neyi denediğiniz ile ilgili yanlışları anlatmıyorsunuz (ve genellikle özel gereksinimler hariç C++ 'da malloc kullanmıyorsunuz). – crashmstr

+0

Bir std :: vector > 'kullanmayı öneririm. –

+0

@ πάνταῥεῖ Eğer o düşük bir yüke gidiyorsa (Bu durumda dizileri gerçekten kullanması için sadece neden) o zaman 'std :: vector >' ifadesini kullanarak marjinal olarak yavaşlatacaktır. (Her ikisi de oluşturma ve silme için) –

cevap

-1

Sadece basit tutmak:

class MyObject: public mainObject 
{ 
} 

MyObject* instance = new MyObject[nb_of_instances_in_array]; 

Ve her şey daha kolay olacak.

1

Aşağıdaki satırın neden sizin için işe yaramadığını inceleyelim.

mainObject* arrayOfMainObjects = new mainObject[nb_of_obj];

arrayOfMainObject her eleman boyutu sizeof(mainObject) sahiptir.

Kalıtsal nesne bazı ek veriler içeriyorsa, mainObject öğesinden devralınan nesneler mainObject öğesinden daha büyük olacaktır. Örneğin sizeof(Object2)>=sizeof(mainObject) // always true!.

Dizideki kalıtsal Nesneleri oluşturmaya çalıştığınızda, yalnızca sizeof(mainObject) için boşluk var ve geri kalanlar kesiliyor.

Bunu düzeltmek için, dizininiz mainObject öğesinin işaretçisini içerebilir ve işaretçileri, devralınan nesnenin türüne atayabilirsiniz.

Ancak şimdi, bellek sızıntısından kaçınmak için dizideki her gösterici artık kullanılmadığında serbest bırakılmalıdır.

Akıllı göstericileri kullanabilir ve problemsiz olabilirsiniz.

std::unique_ptr<mainObject>* arrayOfMainObjects = new std::unique_ptr<mainObject>[nb_of_obj];

DÜZENLEME gibi bir şey: delete arrayOfMainObjects hala gerekli olduğunu unutmayın.

+0

Yani, ne dediğinizi doğru anlarsam, aşağıdaki kod çalışmalıdır: namespace std'yi kullanarak ; size_t max_size(); return (size_t) (max (max (sizeof (Object1), sizeof (Object2)), max (sizeof (Object3), sizeof (mainObject))))); mainObject * arrayOfMainObjects = NULL; arrayOfMainObjects = (mainObject *) malloc (nb_of_obj * max_size()); // Küresel olarak, yukarıdaki 'dan farklı kod (arrayOfMainObjects); Ama öyle değil. Diziye birden fazla nesne eklemeyi denerseniz, program çöküyor. – Dogeek

+0

@Dogeek Bence işe yarayabilir, ama tamamen yanlış olabilirim. Kilitlenme meydana geldiğinde kodu gönderir misiniz? – jezzi23

İlgili konular