2012-05-15 11 views
14

this similar question aracılığıyla okuyor ve yanıtlardan daha az kendimi buldum. "Foo" adında basit bir işlevim yok; Parametreler sağduyulu bir şekilde sağlanmazsa, çok ciddi tehlikelere sahip çok daha karmaşık bir işleve sahibim. Fonksiyonun kendi kurallarını uygulamak ve sistem sağlamlığını sağlamak için "tek bir işlev, yapılacak bir şey" konusunda ısrarcı olan semantik nişanlara yönelmekten ziyade benim için tercih edilir. Bence bu soruya verilen tercih edilen cevaplar, belli durumların gerçekliğini değil, çok fazla kullanılan programlama idealizmini yansıtıyor.Varsayılan bir parametre olarak boş bir std :: vektör belirtmek mümkün mü?

Ne karşıya olduğunu:

void DoSomethingVeryComplex(const CRect bounds, CPoint startPoint = CPoint(-1,-1)); 

Şimdi bu semantik kurallar tatmin olur - bazı şey değil, birkaç şey yapıyor. Yaptığı tek şey karmaşık ve çok aşamalı olmaktır, ama yine de tek bir şeydir.

Bu karmaşık şey için, kullanıcının sınırları sağlaması ve işlevin kendi başlangıç ​​noktasını belirlemesine izin verilmesi önerilir. İleri düzey kullanıcılar, belirli bir alternatif başlangıç ​​noktasını belirlemek ve bunu sağlamak için kayda değer bir matematik yapmak isteyebilirler ... ancak kullanıcılar dikkat etmelidir.

Ve şimdi nadir durumlarda, bir değil, ancak birkaç başlangıç ​​noktası tedarik etmek mantıklı geliyor. Bu, sürecin anlamsal kavramındaki hiçbir şeyi değiştirmez çünkü süreç, bir noktadan komşulara, komşuların komşularına ve benzerlerine yayılan bir süreçtir. Böylece birçok noktadan başlamak doğal bir uzantıdır.

Buna göre, belirlemek için tercih ediyorum: vektör boş ise, fonksiyon daha önce olduğu gibi başlangıç ​​noktası belirler vektör herhangi bir noktası varsa

void DoSomethingVeryComplex(const CRect bounds, 
          const std::vector<CPoint> startPoint /* = empty" */); 

ve bunlar olarak kullanılır, böylece başlangıç ​​noktası.

Bunu yapmamı sağlayan bir C++ sözdizimi var mı - boş bir diziyi varsayılan parametre olarak belirtmek için?

const std::vector<CPoint> startPoint = {} 

Bundan önce, bu çalışacaktır:

const std::vector<CPoint> startPoint = std::vector<CPoint>() 

Bunların her ikisi de boş bir vektör oluşturur varsayılan kurucu, çağırmak C

cevap

23

en basit olduğunu, 11 ++. Aynı sözdiziminin, uygun argümanları doldurduğunuz sürece, diğer kurucuları da çağırmak için kullanılabileceğini unutmayın. Kendi sınıfları, here's a link on how it works için yeteneği bu tür istiyorsanız

const std::vector<CPoint> startPoint = {CPoint(1, 2), CPoint(4, 5), CPoint(3, 9)} 

:

//this one has 5 default-constructed CPoints 
const std::vector<CPoint> startPoint = std::vector<CPoint>(5) 

C++ 11 olarak, hatta bir varsayılan vektör doldurabilir.

+0

Beni bunun için dövün. +1 – Martol1ni

+0

Teşekkürler! Bunu yapmanın bir yolu olması gerektiğini biliyordum. Aslında bunu yapmak istediğimden emin değilim - varsayılan bir parametrenin olmaması daha açık olabilir ... ama eski varsayılan parametreyi elimine edersem değişecek eski kodlar var. – omatai

+0

@omatai, aslında standart haline getirmek için eski koddan geçmek güzel değil. – chris

İlgili konular