C'è un altro modo più semplificato per fare quello che vuoi:basta cambiare la tua affermazione da test tst_("Hi");
a test tst_{"Hi"};
e funzionerà. Di seguito è riportato il codice modificato e funziona come previsto.
#include <iostream>
#include <string>
using namespace std;
class test
{
public:
test(std::string s):str(s){cout<<"str is: "<<s;}
private:
std::string str;
};
class test1
{
public:
test tst_{"Hi"};
};
int main()
{ test1 obj;
return 0;
}
Nota che ho appena cambiato test tst_("Hi");
a test tst_{"Hi"};
e tutto il resto è esattamente lo stesso. Solo per confermare che funziona, ho aggiunto un cout per verificare che inizializzi correttamente la variabile str. Penso che questa soluzione di una linea sia più elegante (almeno per me) e aggiornata con il nuovo standard.
Non puoi inizializzare tst_
dove lo dichiari. Questo può essere fatto solo per static const
tipi primitivi. Dovrai invece avere un costruttore per class test1
.
EDIT:di seguito, vedrai un esempio funzionante che ho fatto in ideone.com. Nota alcune modifiche che ho apportato. Primo, è meglio avere il costruttore di test
prendi un const
riferimento a string
per evitare di copiare. Secondo, se il programma ha successo dovresti return 0
non 1
(con return 1
ottieni un errore di runtime in ideone).
#include <iostream>
#include <string>
using namespace std;
class test
{
public:
test(const std::string& s):str(s){};
private:
std::string str;
};
class test1
{
public:
test1() : tst_("Hi") {}
test tst_;
};
int main()
{
return 0;
}