Yeni

2015-11-29 19 views
10

ile kurucu argümanlarını nasıl iletirim Bir kurucuya argümanları aktarmaya çalışıyorum ama bu sırada böyle bir nesne dizisi yapıyorum. bir sözdizimi hatası değildi,Yeni

PointPtr centroids = new Point[k](5);

Eh, ama derlemek etmedi: Ben oraya aşağıdaki kodu kullanılır. Point için varsayılan bir kurucuya "5" kodunu zorlamak istemedim. Bunu nasıl yapmam gerektiğine dair bir fikrin var mı? Teşekkürler!

BTW, zaten başka bir yerde typedef Point *PointPtr yaptım.

Başlık doğru değilse üzgünüz. Bunu nasıl özetleyeceğimi bilmiyordum.

Sen işaretçiler (yani Point**) bir dizi oluşturmak ve 2 adımda bunları başlatabilir
+2

Üzgünüm bunu dinamik dizilerle yapamazsınız. Nesneleri oluşturmak için 'emplace_back' kullanılmasına izin veren bir vektör kullanmayı düşünün. –

+2

Henüz 'yeni' önlemek için başka bir neden. –

+0

Evet ... atamam için henüz vektörleri kullanamıyorum. –

cevap

-5

:

  1. dizi oluşturun:

    PointPtr* centroids = new PointPtr[k];

  2. başlatma:

    for (int i=0 ; i<k ; ++i) centroids[i]=new Point(5);

+1

Evet hayır. Bu Java değil. – szczurcio

+0

Biliyorsunuz, bu gerçekten işe yarayabilir! –

+1

Hayır, bu aslında işe yaramazdı –

10

Ben std::vector kullanarak öneririm:

std::vector<Point> v(k, Point{5}); 

Ama aynı zamanda bunu yapabilirsiniz:

Point* centroids = new Point[5]{{1}, {2}, {3}, {4}, {5}}; 

Live Demo

+2

Bu şekilde bilmiyordum! –

+0

Vektör olmayan çözüm, "Point" bir toplam olmadığı zaman da çalışır mı? – MicroVirus

+0

@MicroVirus Evet, bir "int" alan bir kurucu sağlarsanız. – szczurcio

3

Eğer std::vector kullanamıyorsanız, o zaman bir seçenek dinamik etmektir Bir dizi işaretçi ayırın, daha sonra n nesnelerini dinamik olarak ayırın ve sonuçta oluşan belleği dizideki işaretçilere atayın. Örneğin:

constexpr auto ARRAYSIZE = 5; 

auto x = new PointPtr[ARRAYSIZE]; // should check for memory alloc errors 
for (int i = 0; i < ARRAYSIZE; ++i) 
{ 
    x[i] = new Point(5); // pass any arguments you want, remember to check if allocation was successful 
} 

Not bunu yapmak için çok iyi bir nedeniniz olmadıkça gerçekten new kullanmak asla çünkü hoş karşılanmaz böyle uygulamalar (ve IMO bunu şeyleri doğru şekilde yapmaya izin verilmez o aptal olduğunu ve başlangıçtan iyi uygulamalar öğretti); bunun yerine std::vector ve akıllı işaretçiler kullanın, tüm dinamik bellek ihtiyaçlarınızı karşılayabilmelidir.

+0

Evet, teşekkürler. Lütfen başka bir yorumda belirtildiği gibi, bu ödev için STL'yi kullanamıyorum, –

2

Not 1: şeyler işlemek için standart kitaplığı (bu durumda yani std::vector) kullanarak prefereable olduğunu!

Not 2: Kişisel olarak, bellek konumunuzu yok ettiğiniz için işaretçi dizisi dizisini aşmazdım.

// Create allocator object 
std::allocator<Point> alloc; 
// allocate storage for k Points 
Point * p = alloc.allocate(k); 
// Construct k Points in p 
for (std::size_t i{0}; i<k; ++i) 
{ 
    alloc.construct(p+i, 5); 
} 
// Do stuff using p 
// ... 
// Destroy k objects in p 
for (std::size_t i{0}; i<k; ++i) 
{ 
    alloc.destroy(p+i); 
} 
// Dealloacte memory 
alloc.deallocate(p, k); 

yoksa fonksiyonları içine işleme belleği kaydırmak istediğiniz yeri en az (bir sınıf varsa) manuel

// allocate 
Point * p = static_cast<Point*>(::operator new[](k*sizeof(Point))); 
// placement new construction 
for (std::size_t i{0}; i<k; ++i) 
{ 
    new((void *)(p+i)) Point{5}; 
} 
// stuff 
// destruction 
for (std::size_t i{0}; i<k; ++i) 
{ 
    (p+i)->~Point(); 
} 
// deallocation 
::operator delete[](static_cast<void*>(p)); 

hallederim:

Sen std::allocator kullanabilirsiniz :

( ) ve bunları kullanmak için
auto p = new_n<Point>(k, 5); 
// stuff using k Points in p constructed by passing 5 to constructors 
remove_n(p, k); 
+0

adlı düzenlemeyi okuyun. Bunu başka biri için kullanabilirim, ancak bu ödevin sadece işaretlerini göndermem gerekiyor. Yine de teşekkürler! –

+0

'std :: size_t i {0}' - şu ana kadar gördüğüm bir döngü değişkenini başlatmanın en orijinal yoludur: P – szczurcio

+0

'std :: size_t i {} ayrıca yeterli olur, değil mi? C'nin boş parantezlere izin vermediğini biliyorum ama C++'nın yaptığı izlenim altındaydım. – dreamlax