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
Beni bunun için dövün. +1 – Martol1ni
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
@omatai, aslında standart haline getirmek için eski koddan geçmek güzel değil. – chris