Re: Class Destroys itself straight away!
- From: Gerry Hickman <gerry666uk@xxxxxxxxxxxxxxxx>
- Date: Sat, 26 Jan 2008 19:00:45 +0000
Hi David, Alex,
Thanks for the solution. Are there any articles/tutorials on this?
I looked at the code here
http://www.cplusplus.com/doc/tutorial/classes.html
Is it because they are passing numeric constants direct that it doesn't create a copy?
// example: class constructor
#include <iostream>
using namespace std;
class CRectangle {
int width, height;
public:
CRectangle (int,int);
int area () {return (width*height);}
};
CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
}
int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
David Wilkinson wrote:
Gerry Hickman wrote:Hi,
I have a Class who's constructor accepts an STL wstring, but it seems to kill itself before it can be used. If I initialize with int, it works as expected. Here's the sample code and the output. Note the Destructor is firing twice.
#include "stdafx.h"
using namespace std;
class MyClass
{
public:
MyClass(wstring);
~MyClass(void);
void SayHello(void);
};
int _tmain(int argc, _TCHAR* argv[])
{
wstring wsInput = _T("Passed in String");
MyClass mc = MyClass(wsInput);
// Class kills itself here!
wcout << "About to use Class" << endl;
mc.SayHello();
return 0;
}
MyClass::MyClass(wstring wsNewString)
{
wcout << "Constructing Class" << endl;
}
MyClass::~MyClass(void)
{
wcout << "Destructing Class" << endl;
}
void MyClass::SayHello()
{
wcout << "Say Hello" << endl;
}
// Output From Program
Constructing Class
Destructing Class <-- WHY??
About to use Class
Say Hello
Destructing Class
Gerry:
This is happening because you are making unnecessary copies. Try like this:
class MyClass
{
public:
MyClass(const wstring&);
~MyClass(void);
void SayHello(void);
};
int _tmain(int argc, _TCHAR* argv[])
{
wstring wsInput = L"Passed in String";
MyClass mc(wsInput);
wcout << L"About to use Class" << endl;
mc.SayHello();
return 0;
}
Always pass input parameters by const reference if you can.
You can also do just
MyClass mc(L"Passed in String");
BTW, you should not use _T("") with wstring; use L"". If you want "build-agnostic" code you can do things like
typdef std::basic_string<TCHAR> tstring;
--
Gerry Hickman (London UK)
.
- Follow-Ups:
- Re: Class Destroys itself straight away!
- From: Alex Blekhman
- Re: Class Destroys itself straight away!
- References:
- Class Destroys itself straight away!
- From: Gerry Hickman
- Re: Class Destroys itself straight away!
- From: David Wilkinson
- Class Destroys itself straight away!
- Prev by Date: Re: Class Destroys itself straight away!
- Next by Date: Re: Class Destroys itself straight away!
- Previous by thread: Re: Class Destroys itself straight away!
- Next by thread: Re: Class Destroys itself straight away!
- Index(es):
Relevant Pages
|