Il existe une autre façon plus simplifiée de faire ce que vous voulez :modifiez simplement votre déclaration de test tst_("Hi");
à test tst_{"Hi"};
et ça marchera. Vous trouverez ci-dessous le code modifié et il fonctionne comme prévu.
#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;
}
Notez que je viens de changer test tst_("Hi");
à test tst_{"Hi"};
et tout le reste est exactement pareil. Juste pour confirmer que cela fonctionne, j'ai ajouté un cout pour vérifier qu'il initialise correctement la variable str. Je pense que cette solution à une ligne est plus élégante (du moins pour moi) et à jour avec la nouvelle norme.
Vous ne pouvez pas initialiser tst_
où vous le déclarez. Cela ne peut être fait que pour static const
types primitifs. Au lieu de cela, vous aurez besoin d'un constructeur pour class test1
.
EDIT :ci-dessous, vous verrez un exemple de travail que j'ai fait dans ideone.com. Notez quelques modifications que j'ai apportées. Tout d'abord, il est préférable d'avoir le constructeur de test
prendre un const
référence à string
pour éviter la copie. Deuxièmement, si le programme réussit, vous devez return 0
pas 1
(avec return 1
vous obtenez une erreur d'exécution dans 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;
}