Existuje další a jednodušší způsob, jak dělat to, co chcete:Stačí změnit své prohlášení z test tst_("Hi");
do test tst_{"Hi"};
a bude to fungovat. Níže je upravený kód a funguje podle očekávání.
#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;
}
Všimněte si, že jsem právě změnil test tst_("Hi");
až test tst_{"Hi"};
a všechno ostatní je úplně stejné. Jen pro potvrzení, že to funguje, jsem přidal jeden cout, abych zkontroloval, že správně inicializuje proměnnou str. Myslím, že toto jednořádkové řešení je elegantnější (alespoň pro mě) a aktuální s novým standardem.
Nemůžete inicializovat tst_
kde to deklarujete. To lze provést pouze pro static const
primitivní typy. Místo toho budete potřebovat konstruktor pro class test1
.
EDIT:níže uvidíte funkční příklad, který jsem udělal na ideone.com. Všimněte si několika změn, které jsem provedl. Nejprve je lepší mít konstruktor test
vezměte const
odkaz na string
abyste se vyhnuli kopírování. Za druhé, pokud program uspěje, měli byste return 0
ne 1
(s return 1
v Ideone se zobrazí chyba za běhu).
#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;
}