2009-07-17 17 views
8

Bazı garip kodlar buldum ...Varsayılan parametre değeri kodda tanımlandığında, arama alanında görünmüyorsa ne olur?

//in file ClassA.h: 
class ClassA { 
public: 
    void Enable(bool enable); 
}; 

//in file ClassA.cpp 
#include <ClassA.h> 
void ClassA::Enable(bool enable = true) 
{ 
    //implementation is irrelevant 
} 

//in Consumer.cpp 
#include <ClassA.h> 
.... 
ClassA classA; 
classA.Enable(true); 

Açıkçası Consumer.cppClassA.h ve ClassA.cpp içermediğinden, derleyici parametrenin varsayılan bir değere sahip olduğunu göremeyecektir.

Yöntem uygulamasının imzasındaki ClassA::Enable'un beyan edilen varsayılan değeri ne zaman etkindir? Bu, yalnızca ClassA.cpp içeren dosyalar içinden yöntem çağrıldığında olur mu?

cevap

11

Varsayılan değerler sadece derleme zamanıdır. Derlenmiş kodda varsayılan değer diye bir şey yoktur (meta veriler veya bunun gibi şeyler yoktur). Temelde bir derleyici yerine "Eğer bir şey yazmazsanız, sizin için bunu belirteceğim." Yani, derleyici varsayılan değeri göremiyorsa, , bir olmadığını varsayar.

Demo:

// test.h 
class Test { public: int testing(int input); }; 

// main.cpp 
#include <iostream> 
// removing the default value here will cause an error in the call in `main`: 
class Test { public: int testing(int input = 42); }; 
int f(); 
int main() { 
    Test t; 
    std::cout << t.testing() // 42 
      << " " << f() // 1000 
      << std::endl; 
    return 0; 
} 

// test.cpp 
#include "test.h" 
int Test::testing(int input = 1000) { return input; } 
int f() { Test t; return t.testing(); } 

Testi: yöntem ClassA.cpp dahil dosyaları içinden çağrıldığında

g++ main.cpp test.cpp 
./a.out 
1

Varsayılan değeri, tanımı değil, bildirime koyun.

class ClassA { 
public: 
    void Enable(bool enable = true); 
}; 
+0

Bunu kim işaretledi? Beni işaretlerseniz, neden söyle, en azından düzeltemem. –

+1

Aslında, bunu işaretleyen bendim ve bunun sebebi, OP'nin açık bir şekilde, tanımı doğru olmayan beyanda yer almak olduğunu bilmesiydi. OP, böyle bir şeyi tanımlamanın nasıl bir etki yarattığını merak ediyor ve soruyu tam bir şekilde okumadan cevapladınız. Ve evet, onu işaretlemenin sebebini bilmemeniz için üzgünüm. Bunu yapmalıydım. – Aamir

+0

OP, beyanda yer almaktan hiç bahsetmedi, bu yüzden bahsettiği görünürlük problemine bir çözüm önerdim. –

1

bunun olabilmesi misiniz? Doğru değil

. Ancak bunu yapmanın neredeyse kesinlikle birden çok tanım hatası üreteceğini unutmayın, bu nedenle varsayılan yalnızca ClassA.cpp içindeki tanım noktasından kullanılabilir.

+0

Bu bir hata değil. Her iki tanım yalnızca varsayılan değerler sağladığında hata üretecektir. –

+0

Gerçek işlevler, dosya birden çok kez çakıştırıldıysa, birden çok tanım hatasına neden olur. –

3

Önce bu tür bir kodu gördüğüm ilk kez bunun olduğunu kabul edeyim. IS başlık dosyasında varsayılan bir değer koymak normal uygulama ancak bu değil.

Tahminimce bu varsayılan değer sadece aynı dosyada yazılan koddan kullanılabilir ve bu şekilde yazan programcı, işlevi çağırmanın bir tür kolaylık olmasını istemişti, ancak istemiyordu. Dış dünyaya görünür arayüzü (başlık dosyası) rahatsız.

İlgili konular