|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
[C++] Chiamare costruttore da un altro costruttore
Ciao,
ho cercato un po' in rete come chiamare un costruttore da un altro, della stessa classe ovviamente. Quasi tutti dicono che non si può: Codice:
class Foo
{
public:
Foo() { /* do stuff */}
Foo(int x) : Foo() { m_x = x; } // NON COMPILA
Foo(int x)
{
Foo(); // NON COMPILA
m_x = x;
}
Foo(int x)
{
this->Foo(); // NON COMPILA
m_x = x;
}
private:
int m_x;
};
Codice:
Foo(int x)
{
this->Foo::Foo(); // COMPILA
m_x = x;
}
Ma perchè in VS funziona così e non in altri compilatori? Ok, non sarà standard C++, ma mi pare una bella "customizzazione" da avere. E poi perchè devo specificare la classe se uso this? Cioè scrivere this->Foo::Foo() anzichè solo this->Foo() ? |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: May 2008
Messaggi: 1566
|
Quote:
Quote:
__________________
CM Obsidian 750D - Corsair TX650M - AMD Ryzen 7 3700x - Asus TUF B550-PLUS - nVidia Gigabyte GTX 1060 6GB G1 Gaming - Noctua D15S - Corsair Vengeance Pro 3600MHz 16GB - 2xHP x27i - Razer Deathadder - Logitech G15 v1 nVidia Edition- Roccat Taito King-Size - Fastweb (2011) | Alice(2015) | Alice(2016) | Eolo 30Mb (2016) | Wind3 4G Flat (2019) | PF AIR 100 (2021) |
||
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
@L4ky: ma io voglio chiamare il costruttore della classe x dalla classe x!! Cioè, quando l'utente chiama il costruttore con 4 argomenti prima viene eseguito il costruttore con 1 argomento (che fa determinate cose) ed in più opera sugli altri 3 argomenti passati. Così da evitare di riscrivere, all'inizio del costruttore con 4 argomenti, il codice che già è scritto nel costruttore con 1 argomento: Codice:
Species::Species(const char* fileName) : isTDStateDefined(false)
{
ifstream ifs(fileName);
if (!ifs) cerr << "Coudln't open file " << fileName << " - Cannot read species!" << endl;
ifs >> name >> MW;
ifs >> Tc >> Pc >> pitzer;
ifs >> cp1 >> cp2 >> cp3 >> cp4 >> cp5 >> minCpT >> maxCpT;
ifs >> hv1 >> hv2 >> hv3 >> hv4 >> minHvT >> maxHvT;
ifs >> pv1 >> pv2 >> pv3 >> pv4 >> pv5 >> minPvT >> maxPvT;
ifs.close();
}
Species::Species(const char* fileName, const double& T, const double& P, IEoS tipo)
{
this->Species::Species(fileName);
assign_TD_state(T, P, tipo);
}
Inoltre, lasciando perdere la formattazione poco robusta del file di input, so che sarebbe meglio delegare il compito del primo costruttore ad una funzione dedicata, tipo read_species_data(), sarebbe più giusto distinguere i compiti, ma mi sono incapponito su questo modo di operare per pura curiosità. Ultima modifica di vendettaaaaa : 26-11-2012 alle 21:34. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Semplicemente così
Codice:
#include <iostream>
using namespace std;
class Foo
{
public:
Foo() { cout << "Costr. 1" << endl;}
Foo(int x)
{
cout << "Costr. 2" << endl;
Foo();
m_x = x;
}
private:
int m_x;
};
int _tmain(int argc, _TCHAR* argv[])
{
Foo f(0);
return 0;
}
Ultima modifica di lorenzo001 : 26-11-2012 alle 22:37. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
http://sdrv.ms/WT6ZLr |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Manca la dichiarazione della classe per controllare ... comunque ti manca il costruttore di default ... aggiungi
Species() {}; |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
http://sdrv.ms/QHkLPN |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Non ho capito ... vedo che hai ancora i due errori ...
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Chiamare un costruttore da un altro costruttore (delegated constructors/forwarding constructors) è stato introdotto dal C++11 e questa funzionalità non è al momento supportata da Visual Studio 2012.
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Se non sei convinto prova così: Codice:
class Foo
{
public:
Foo()
{
m_x = 4;
cout << "Costr. 1" << endl;
cout << m_x << endl;
}
Foo(int x)
{
cout << "Costr. 2" << endl;
m_x = x;
Foo();
cout << m_x << endl;
}
private:
int m_x;
};
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
Codice:
#include <iostream>
using namespace std;
class Foo
{
public:
Foo()
{
m_x = 4;
cout << "Costr. 1" << endl;
cout << m_x << endl;
}
Foo(int x)
{
cout << "Costr. 2" << endl;
m_x = x;
this->Foo::Foo();
cout << m_x << endl;
}
private:
int m_x;
};
int main()
{
Foo a(5);
return 0;
}
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Considera i seguenti - Il costruttore inizializza inizializza tutti i campi di un oggetto. - Alcuni campi potrebbero avere tipo con costruttore non banale (ad esempio, alloco memoria) - Non viene mai chiamato il corrispondente distruttore del primo costruttore. Esempio Codice:
struct Foo
{
int* mem;
Foo()
{
mem = new int;
}
~Foo()
{
delete mem;
}
};
struct Bar
{
Foo foo;
Bar(){ *foo->mem = 0; }
Bar(int x)
{
this->Bar::Bar();
*foo->mem = x;
}
};
void baz()
{
Bar bar;
}
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Il codice corretto e' Codice:
struct Bar
{
Foo foo;
Bar(){ *foo.mem = 0; }
Bar(int x)
{
this->Bar::Bar();
*foo.mem = x;
}
};
entrambi chiamano il costruttore di Foo() che quindi alloca memoria due volte. Ma il distruttore viene chiamato solo una volta, per cui la memoria allocata la prima volta non viene liberata.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
Cmq ho capito, grazie per avermelo fatto notare! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:52.




















