2009-11-24 14 views
5

ben şöyle bir if-else bloğunda bir değişkeni bildirmek için çalışıyorum bir değişkenin belirtilmesi derlemek için:C bir if-else bloğu ++

driver.cpp:38: error: unused variable ‘player’
driver.cpp:40: error: unused variable ‘player’
driver.cpp:42: error: unused variable ‘player’
driver.cpp:45: error: ‘player’ was not declared in this scope

Herhangi bir fikir? Eğer { } tarafından sınırlandırılmış bir kapsam, içinde bir statik değişkeni koyarsanız kapsam sona erdiğinde

cevap

20

Sorununuz, eğer blok varsa, eğer/else olursa olsun, oyuncunun kapsam dışında kalmasıdır.

Değişkeninizi tüm ifadelerden önce bildirmeniz gerekir.

Ancak bunun için bir referans kullanamazsınız, çünkü bir referansı hemen başlatmanız gerekir.

Bunun yerine muhtemelen böyle bir şey istiyorum: Üç farklı kapsamlarda üç ayrı player değişkenleri ilan ettik

int main(int argc, char *argv[]) { 

    Player * pPlayer = NULL; 
    if (argv[3] == string("simple")) { 
     pPlayer = get_Simple(); 
    } else if (argv[3] == string("counting")) { 
     pPlayer = get_Counting(); 
    } else if (argv[3] == string("competitor")) { 
     pPlayer = get_Competitor(); 
    } 

    //Then if you really want to... 
    Player &player = *pPlayer; 

} 
+3

doğrulamak için iddialarda kullanmamalısınız, ama senin tipin parametre alır bir fabrika yöntemini alarak sonunda bütün işaretçi/başvuru şaşırtıcı değişim önlemek olabilir düşündürmektedir ve ediyorum bir oyuncu * döndürür. Yani ana yönteminiz Oyuncu ve oyuncu = * getPlayerByType (argv [3]); ', ve getPlayerByType() 'daki' if 'ifadeleri, her biri doğrudan geri döner, böylece tüm bu yerel değişken çirkinlikten kaçınır. – bradheintz

+2

@bradheintz: Bu tavsiye en ufak bir şekilde yardımcı olmaz (gerçekte, yanlış tavsiyelerde bulunarak cevabı karıştırır). OP'nin aslında söylediklerinizi tam olarak yapmaya çalıştığı açıktır (ve çözümünüzde bir işaretçi yerine bir referans döndürün). Ancak, buradaki sorunun tek liste haline getirilmiş versiyonunu yayınladı. Eğer bir cevap göndermek istiyorsanız, o zaman en azından soruya cevap vermemek için size olumsuz bir işaret verebiliriz. –

+0

Nesnenin oluşturulmasının tek bir sorumluluk fonksiyonuna dönüştürülmesi, gereksiz bir yerel değişkenin ortadan kaldırılması ve ana() işlevinin daha taranabilir hale getirilmesiyle ilgili neyin yanlış olduğuna emin değilim - ama eğer benim tavsiyem "yanlış" demeyi daha kolay hale getirirse ya da Brian R. Bondy'nin iddiayı desteklemeden iyi bir şekilde "dağınıklığı" konusunda önerilen bir düzeltmeyi çağırmak için onunla geçin. – bradheintz

3

, o Değişken artık satışa sunulacak.

yerine bu deneyin:

int main(int argc, char *argv[]) { 

    // TODO: validate argc and argv here 
    if (argc < 3) { 
     printf("error: not enough arguments\n"); 
     exit(1); 
    } 

    Player* player_ptr = NULL; 
    if (argv[3] == string("simple")) { 
     player_ptr = get_Simple(); 
    } else if (argv[3] == string("counting")) { 
     player_ptr = get_Counting(); 
    } else if (argv[3] == string("competitor")) { 
     player_ptr = get_Competitor(); 
    } 

    if (!player_ptr) { 
     printf("error: invalid argument %s\n", argv[3]); 
     exit(1); 
    } 

    Player& player = *player_ptr; 

    // More code 
} 
+1

referans bir başlangıç ​​değerine sahip olması gerekir. –

+0

Bu derleme mi? referanslar başlatılmalıdır ... – stefanB

+0

Yup, berbat ettim. Düzeltmek için çalıştı. – Parappa

0

değişkeni yalnızca {} 's arasında var

if (argv[3] == string("simple")) { 
    Player & player = *get_Simple(); 
} 

yılında. }'a ulaştığınızda, değişken kullanılmamış ve atılmayacak, hiç kullanılmamış olacaktır.

2

ve hata mesajı tam olarak ne anlama söylüyor.

Sen if -Bildirim dışında bir tek oyuncu değişken bildirmek ve sonucu atamanız gerekir. Bu zor bir işlemdir, çünkü oyuncu bir referanstır - bunu bir kez başlatmanız gerekir.

Sen ile başlatmak sonra * GetPlayer() oyuncu nesneye bir işaretçi döndüren bir işlev (GetPlayer() diyelim) içinde if -Bildirim koymak ve olabilir.

16

Diğerleri işaretçi önerdi. Bununla birlikte, koşullu operatör de kullanılabilir.

Player & player = argv[3] == string("simple") ? get_Simple() 
       : argv[3] == string("counting") ? get_Counting() 
       : get_Competitor(); 
0
#include <map> 

int main(int argc, char **argv) 
{ 
    typedef std::map<std::string, Player*(*)()> lookup; 
    lookup mapping; 

    mapping["simple"] = get_Simple; 
    mapping["counting"] = get_Counting; 
    mapping["competitor"] = get_Competitor; 

    lookup::const_iterator it = mapping.find(argv[3]); 
    if (it == mapping.end()) 
    { 
     std::cout << "illegal argument\n"; 
    } 
    else 
    { 
     Player& player = *it->second(); 
     // more code 
    } 
}