Re: Class Destroys itself straight away!
 
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)