C++

2016-04-12 17 views
0

'daki struct öğesinin veri üyesini başlatılıyor // Bir yapının veri üyesini // struct içinde nasıl başlatabileceğimizi belirleyemedik. Bunun, OOP'un kurallarına aykırı olduğuna inanıyorum. Aşağıdaki programı yapıcısı ile bitti 10 30C++

#include<iostream> 
using namespace std; 
struct Accumulator 
{ 
    int counter = 0; 
    int operator()(int i) { return counter += i; } 
}; 
int main(void) 
{ 
    Accumulator acc; 
    cout << acc(10) << endl; //prints "10" 
    cout << acc(20) << endl; //prints "30" 
} 
+2

bunu bu ekstra şeyler gerekmedikçe 'std :: endl' kullanmayın yapar. '\ n \ 'bir satır biter. –

cevap

0

Eğer başlangıç ​​değerini geçebilir hangi çıkış herhangi derleyici hatayı gösteren ve cezaları çalışır ve fikir sahibi olabiliriz. gibi

şey: Bir yapıcı olmayan yapı bir agrega ise ve aggregate initialization kullanabilirsiniz çünkü

struct Accumulator 
{ 
    Accumulator(int initial = 0) 
     : counter(initial) 
    {} 

    int counter; 

    int operator()(int i) { return counter += i; } 
}; 

int main(void) 
{ 
    Accumulator acc(20); 
    std::cout << acc(10) << '\n'; //prints "30" 
    std::cout << acc(20) << '\n'; //prints "50" 

    // Reset accumulator 
    acc = Accumulator(); // Use constructors default argument 
    std::cout << acc(10) << '\n'; //prints "10" 
    std::cout << acc(20) << '\n'; //prints "30" 
} 

çok yapıcı olmayan çalışıyor acaba neden olursa, bu. Eğer counter üyesinin başlatma merak Eğer bir non-static data member var ve C++ 11 standardına beri bu böyle initialized olabilir çünkü

, bu kadar.

+0

patron bile yapıcı olmadan çalıştığı ve bu benim soru nedir, ben derleyici hatası göstermesi gerektiği gibi derleme hatası yapıyorum – user3798283

+0

@ user3798283 içinde Benim cevabımı güncellendi. –

1

Sınıf başlatmayla ilgili kurallar değişti. C++ 11'den başlayarak, doğrudan statik olmayan bir sınıf üyesini doğrudan sınıf gövdesinde başlatabilirsiniz. Bu sadece sözdizimsel şekerdir. Hepsini aç Hepsini kapa Belirtiler Derleyici aslında varsayılan yapıcıya sayacın başlatılmasını ekleyecektir. Bu nedenle yukarıdaki kod, kendi başlatmanızı sağlarsanız, bu başlatma da bastırılır. Biz

struct Accumulator 
{ 
    int counter = 0; 
    int sum = 0; 
    Accumulator() {} 
    Accumulator(int counter) : counter(counter) {} 
    int operator()(int i) { return counter += i; } 
}; 

olsaydı Sonra Accumulator() {} aslında

Accumulator() : counter(0), sum(0) {} 

ve Accumulator(int counter) : counter(counter) {} olurdu olurdu

Accumulator(int counter) : counter(counter), sum(0) {}