2015-06-30 24 views
5

Sto tentando di trovare un modo per inizializzare staticamente una struttura che estende un'altra struttura.Inizializzazione statica per le strutture che estendono le strutture

Se ho una struct in C++:

struct aStruct { 
    int a; 
    int b; 
}; 

posso inizializzare staticamente un esempio di questo con:

aStruct aStructInst = { 1, 2 }; 

Posso anche estendere questo struct se voglio un oggetto figlio al negozio Ulteriori informazioni:

struct bStruct : aStruct { 
    int c; 
}; 

C'è un modo per inizializzare staticamente un istanc e di bStruct? Ho provato alcune varianti ma ancora nessuna fortuna. L'inizializzazione statica è importante nel mio caso d'uso per mantenere (tutti) i dati fuori dalla RAM, che è molto limitata (applicazione incorporata).

+2

Se il compilatore supporta le espressioni costanti C++ 11, è possibile provare un costruttore 'constexpr'. Permette inoltre * l'inizializzazione costante *, che fa parte di * inizializzazione statica *. – dyp

+2

Un'altra possibilità in C++ 14 è di usare una funzione 'constexpr' dove si costruisce la struct (possibilmente usando assegnazioni ai membri dati) e si restituisce, basandosi sul (implicito)' constexpr'iveness della copia implicitamente creata/spostare il costruttore. – dyp

risposta

6

Si sta utilizzando "inizializzazione di aggregazione" ma una classe con una classe di base non può essere un aggregato, quindi non è possibile utilizzare l'inizializzazione di aggregazione.

Come il commento dice sopra, se si aggiunge un costruttore adatto quindi è possibile utilizzare la stessa sintassi:

struct bStruct : aStruct { 
    constexpr bStruct(int a, int b, int c) : aStruct{a, b}, c(c) { } 
    int c; 
}; 

(Non avete bisogno di un costruttore per aStruct perché questo è ancora un aggregato così può ancora essere inizializzato direttamente usando l'inizializzazione aggregata).

+0

garantirebbe l'inizializzazione statica? – Slava

+2

@Slava Non garantisce * init statico in generale, ma * consente * init statico. Se l'entità che stai inizializzando con questo costruttore è una variabile non locale e gli argomenti del costruttore sono tutte espressioni costanti, * allora * garantisce l'init statico. È anche molto probabile che esegua init statiche di variabili statiche locali, se gli argomenti sono espressioni costanti. – dyp

+0

@dyp Buono a sapersi, grazie – Slava

2

è necessario definire un costruttore in bStruct come questo:

bStruct(int a, int b, int c) : aStruct{a, b}, c(c) {}

Questo inizializzerà aStruct e il campo c.

Nota: questo è il codice C++ 11.

-2
#include <iostream> 
using namespace std; 

struct A 
{ 
    int a; int b; 
}; 
struct B : A 
{ 
    //c++ 0x 
    B(int a, int b, int c) : A{ a, b }, c(c) 
    {} 
    int c; 
}; 
int main() 
{ 
    B b{ 1,2,3 }; 
    cout << b.a << b.b << b.c << endl; 
} 
+1

Ho paura che manchi il punto, vuole l'inizializzazione statica – Slava

Problemi correlati