Bir C++ sınıf kitaplığında hata işleme kavramını geçirme görevindeyim. Daha önce basitçe boole (başarı/başarısızlık) döndüren metotlar, bir makine tarafından okunabilir hata kodunu ve insan tarafından okunabilir bir açıklama (ve burada önemi olmayan bir kısmı) taşıyan bir Result
nesnesini döndürmek için değiştirilecektir.C++: "Açık" bir görevlendirme operatörü yapabilirim "
Binlerce satırlık kodun yürürlüğe girmesi hataya açık olduğundan, bu görev için derleyiciden en iyi desteği almaya çalışıyorum.
Benim sonuç sınıfı var - diğer üye yöntemler arasında - Bir kod ve kod için bir atama operatöründen sonucunu oluşturur bir yapıcısı:
class Result
{
public:
typedef unsigned long ResultCode;
explicit Result(ResultCode code); // (1)
Result& operator=(ResultCode code); // (2)
};
Not: Genellikle ResultCode
için bir enum sınıfını kullanırsınız hangi Sorunlarımı çözerdi, ama bu bir seçenek değil. Bunun nedeni, ana tasarım nesnesinin farklı kütüphanelerde Result
kullanmasıdır, her bir kütüphane için olası tüm sonuç kodlarını tanımlayan bir büyük başlık dosyası gerektirmeden her biri kendi sonuç kümesi kodlarını tanımlamalıdır. Aslında, her sınıf, yerel sonuç kodlarını tanımlayabilecek, böylece olası sonuç kodlarının listesi sınıf başlığından alınabilecektir. Böylece kodlar Result
numaralı numarada numaralandırılamaz, bunlar Result
sınıfını kullanarak sınıflar tarafından tanımlanmalıdır.
return true;
tablolara ilişkin örtülü dönüşüm önlemek için, yapıcı açık ilan edilmiştir. Ancak yuvalama yöntemi çağrılarında, başka bir sorun oluşur. De ki, ben bir Result
nesnesi döndüren bir işlev kullanıyorum bir yöntemini
bool doSomething()
{
return true;
}
var. örtülü dönüştürülür) doSomething boole dönüş değeri (- Ben, bu bana bir derleyici hata vermek etmeyecek iç içe aramalar Result
'ın atama operatörünün geçerli uygulama ile
Result doSomethingElse
{
Result result = doSomething();
return result;
}
sonucu kodlarını iletmek istiyorum imzasız uzun
C++ belgelerinde okuduğum gibi, yalnızca kurucular ve dönüşüm operatörleri açık olarak bildirilebilir.
Sorularım
- Neden açık atama operatörleri veya diğer yöntemler için izin verilmez? IMO, herhangi bir yöntemin de açık olmasına izin vermesi çok mantıklı olacaktır.
- Atama operatörü için örtülü tür dönüşümü önlemek için başka çözümler var mı? deftere kodu ile ilgili olarak
Ben istediğiniz cevap değil biliyorum ama neden C++ istisna mekanizması kullanmayın olmak 'yakalama' şey bir
unsigned int
olmamak üzere şablon overloadng kullanmak ve onu zorlayabilirsiniz? Dili dövmeyin. Onunla çalışın. (Artı güzel sorulan soru için olsa da). – BathshebaŞablon void operator = (T) = delete; 'i bildiremediniz ve sahip olduğunuzı saklayın. Normal durumda bunu kullanacak ve diğer tüm tipler için silinen yöntemi kullanmaya çalışacaktır. –
doug65536
Mümkün ve hatta teşvik edilip edilmediğini bilmiyorum, ancak bunu kendiniz yapmak yerine [sistem hata sınıflarını] (http://en.cppreference.com/w/cpp/error#System_error) uzatabilirsiniz. ? –