5

yapıcıda 1 argüman bekliyor 0" C++ 'da basit bir iş parçacığı sunucu uygulaması yapıyorum, şey, yapılandırma dosyalarımı ayrıştırmak için libconfig ++ kullanıyorum. Eh, libconfig multithreading desteklemiyor, bu yüzden "destek" için iki sarmalayıcı sınıfları kullanıyorum. Benim main.cpp dosyasından çağrıldığındaGarip "Aday,

class app_config { 
    friend class app_config_lock; 
public: 
    app_config(char *file) : 
     cfg(new libconfig::Config()), 
     mutex(new boost::mutex()) 
    { 
     cfg->readFile(file); 
    } 

private: 
    boost::shared_ptr<libconfig::Config> cfg; 
    boost::shared_ptr<boost::mutex> mutex; 
}; 

korkunç Başarısız:

app_main::app_main(int c, char **v) : argc(c), argv(v) { 
    // here need code to parse arguments and pass configuration file!. 
    try { 
     config = app_config("mscs.cfg"); 
    } catch (libconfig::ParseException &e) { 
     cout << "Parse error at line " << e.getLine() << ": " << e.getError() << endl; 
     throw; 
    } catch (libconfig::FileIOException &e) { 
     cout << "Configuration file not found." << endl; 
     throw; 
    } 
} 

Ve diyor ki: Nokta bunlardan biri başarısız olduğu ben çünkü garip

main.cpp: In constructor ‘app_main::app_main(int, char**)’: 
main.cpp:38:54: error: no matching function for call to ‘app_config::app_config()’ 
main.cpp:38:54: note: candidates are: 
../include/app_config.h:15:5: note: app_config::app_config(char*) 
../include/app_config.h:15:5: note: candidate expects 1 argument, 0 provided 
../include/app_config.h:12:7: note: app_config::app_config(const app_config&) 
../include/app_config.h:12:7: note: candidate expects 1 argument, 0 provided 
main.cpp:41:39: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] (THIS CAN BE IGNORED, I WAS USING STD::STRING, YET CHANGED IT FOR TESTING PURPOSES) 

açıkça bir argümanı geçiriyor ve dahası onun bir char *!

Eh, her zaman olduğu gibi, herhangi bir yardım takdir edilecektir.

Julian.

cevap

10

Yapılandırmanızı varsayılan olarak yapılandırmaya çalışıyorsunuz ve ardından daha sonra atayın. Ancak, varsayılan bir kurucunuz yok.

üye değişkeni kurucusuna bir argüman iletilmesi doğru yoludur:

app_main::app_main(int c, char **v) : argc(c), argv(v), config("mscs.cfg") 

etmeye devam edebilirsiniz tuzak istisna, bir fonksiyon deneyin blok olarak bilinen kullanarak. http://www.gotw.ca/gotw/066.htm

Final kod Bkz: Dinamik muteksleri tahsis yok, hepsinden

app_main::app_main(int c, char **v) 
try : argc(c), argv(v), config("mscs.cfg") 
{ 
    // more constructor logic here 
} catch (libconfig::ParseException &e) { 
    cout << "Parse error at line " << e.getLine() << ": " << e.getError() << endl; 
    throw; 
} catch (libconfig::FileIOException &e) { 
    cout << "Configuration file not found." << endl; 
    throw; 
} 
+0

Bu sorunu çözdü. Ancak, statik bir dizgeden ziyade değişken bir dizeyi geçirmeyi planlıyorum, app_main üyemdeki argc ve argv değişkenlerimi gerçekten işleme koyabildiğim herhangi bir yol var mı? –

+1

@JulianBayardoSpadafora: Hayır. Kurucu argümanlarını sadece derleme zamanı sabitleri değil, üye yapıcılara da iletebilirsiniz. Ve ayrıca * ctor-initializer-list * içinde statik üye fonksiyonlarını da arayabilirsiniz. Son olarak, üyelerin oluşturulduğu düzen üzerinde kontrolünüz var. Ancak, muhtemelen bu işlemden önce argüman işlemi yapmanız ve 'getConfigFilename()' veya böyle bir üye işleviyle bir çeşit seçenek paketi nesnesini iletmeniz gerekecektir. Veya 'app_config' dosyasını yapıcıdan yapmak yerine okumak için bir işlev verin. –

4

İlk, hiç bir amaca hizmet eder. İkincisi, varsayılan olarak yapılandırılamayacak bir veri üyeniz olduğu ve bunu ctor init listesinden başlatmamış olmanızdır. Artı, hiçbir zaman char* değişkenlerine dize değişmezleri atamayın (gerçekten de char işaretçilerle dalga geçmek istiyorsanız app_config(const char*) olmalıdır).

Sizin app_main::app_main artık şöyle görünmelidir:

app_main::app_main(int c, char **v) try 
    : argc(c), argv(v), config("mscs.cfg") { 
} catch (libconfig::ParseException &e) { 
    cout << "Parse error at line " << e.getLine() << ": " << e.getError() << endl; 
    throw; 
} catch (libconfig::FileIOException &e) { 
    cout << "Configuration file not found." << endl; 
    throw; 
}