Why do I need to overload =

J

John Doe

Hi,

I am trying to transform a class with some time consuming operation by
adding a thread. To be able to pass data to thread I have declared a
class ThreadParam as shown below :



class CProvisioning
{
public:
struct ThreadParam
{
ThreadParam(CProvisioning* a_pThis, const CString& a_strConfig,
CString& a_strXmlOut):
pThis(a_pThis),
strConfig( a_strConfig ),
strOut( a_strXmlOut ) {}


CProvisioning* pThis;
const CString& strConfig;
CString& strOut;
};

CProvisioning(void);
~CProvisioning(void);

static DWORD ProvisioningThr(LPVOID pvarg);
DWORD ProvisioningThr(const CString& strConfig, CString& strXmlOut);

BOOL ProcessConfigXML(const CString& strConfig, CString& strOut);


protected:

ThreadParam m_thrParam;
HANDLE m_hProvThread;
};

CProvisioning::CProvisioning(void):
m_thrParam(this, CString(_T("")), CString(_T(""))),
m_hProvThread(NULL)
{
}

The ProcessConfig method receives two strings, one holding the config
file and the other to put the result:


BOOL CProvisioning::processConfigXML(const CString& strConfig, CString&
strXmlOut)
{
DWORD dwRet = 0;

// Start a thread
m_thrParam = ThreadParam(this, strConfig, strXmlOut);
m_hProvThread = CreateThread(
NULL,
0,
&CProvisioning::provisioningThr,
&m_thrParam,
0, NULL);
...
}

/*static*/
DWORD CProvisioning::provisioningThr(LPVOID pvarg)
{
ThreadParam* pThrParam = static_cast<ThreadParam*>(pvarg);
if (pThrParam) {
CProvisioning* pThis = pThrParam->pThis;
return pThis->ProvisioningThr(pThis->m_thrParam.strConfig,
pThis->m_thrParam.strOut);
}

return -1;
}


DWORD CProvisioning::provisioningThr(const CString& strConfig, CString&
strXmlOut)
{
// Some lengthy operations ...

return 0;
}


The problem I get is with m_thrParam = ThreadParam(this, strConfig,
strXmlOut); because I get :

error C2582: 'operator =' function is unavailable in
'CProvisioning::ThreadParam'


1) First I don't understand why I need to overload =
2) How can I fix it ?
 
J

John Doe

Victor said:
John said:
I am trying to transform a class with some time consuming operation by
adding a thread. To be able to pass data to thread I have declared a
class ThreadParam as shown below :
[..]
struct ThreadParam
{
ThreadParam(CProvisioning* a_pThis, const CString&
a_strConfig, CString& a_strXmlOut):
pThis(a_pThis),
strConfig( a_strConfig ),
strOut( a_strXmlOut ) {}


CProvisioning* pThis;
const CString& strConfig;
CString& strOut;
};
[...]

The problem I get is with m_thrParam = ThreadParam(this, strConfig,
strXmlOut); because I get :

error C2582: 'operator =' function is unavailable in
'CProvisioning::ThreadParam'


1) First I don't understand why I need to overload =

The compiler cannot generate one because you have reference members.
Once initialised (during construction), a reference cannot be reseated.
2) How can I fix it ?

You need to overload the assignment operator and decide what to do with
the 'strConfig' member (e.g. leave it alone) and the 'strOut' member.
*An example* of your operator= might look like this:

struct ThreadParam
{
...
ThreadParam& operator=(ThreadParam const& other)
{
pThis = other.pThis;
return *this;
}
};

V
The problem is once I run :

m_thrParam = ThreadParam(this, strConfig, strXmlOut);
strConfig is a valid reference but strXmlOut is NULL ...
 
J

John Doe

John said:
Victor said:
John said:
I am trying to transform a class with some time consuming operation
by adding a thread. To be able to pass data to thread I have declared
a class ThreadParam as shown below :
[..]
struct ThreadParam
{
ThreadParam(CProvisioning* a_pThis, const CString&
a_strConfig, CString& a_strXmlOut):
pThis(a_pThis),
strConfig( a_strConfig ),
strOut( a_strXmlOut ) {}


CProvisioning* pThis;
const CString& strConfig;
CString& strOut;
};
[...]

The problem I get is with m_thrParam = ThreadParam(this, strConfig,
strXmlOut); because I get :

error C2582: 'operator =' function is unavailable in
'CProvisioning::ThreadParam'


1) First I don't understand why I need to overload =

The compiler cannot generate one because you have reference members.
Once initialised (during construction), a reference cannot be reseated.
2) How can I fix it ?

You need to overload the assignment operator and decide what to do
with the 'strConfig' member (e.g. leave it alone) and the 'strOut'
member. *An example* of your operator= might look like this:

struct ThreadParam
{
...
ThreadParam& operator=(ThreadParam const& other)
{
pThis = other.pThis;
return *this;
}
};

V
The problem is once I run :

m_thrParam = ThreadParam(this, strConfig, strXmlOut);
strConfig is a valid reference but strXmlOut is NULL ...
I think I miss one important answer :
Once initialised (during construction), a reference cannot be reseated.

So what I want to do is not possible...
 
B

Barry

Hi,

I am trying to transform a class with some time consuming operation by
adding a thread. To be able to pass data to thread I have declared a
class ThreadParam as shown below :

class CProvisioning
{
public:
        struct ThreadParam
        {
                ThreadParam(CProvisioning* a_pThis, const CString& a_strConfig,
CString& a_strXmlOut):
                        pThis(a_pThis),
                        strConfig( a_strConfig ),
                        strOut( a_strXmlOut ) {}

                CProvisioning* pThis;
                const CString& strConfig;
                CString& strOut;
        };

        CProvisioning(void);
        ~CProvisioning(void);

        static DWORD ProvisioningThr(LPVOID pvarg);
        DWORD ProvisioningThr(const CString& strConfig, CString& strXmlOut);

        BOOL ProcessConfigXML(const CString& strConfig, CString& strOut);

protected:

        ThreadParam m_thrParam;
        HANDLE m_hProvThread;

};

CProvisioning::CProvisioning(void):
m_thrParam(this, CString(_T("")), CString(_T(""))),
m_hProvThread(NULL)
{

}

The ProcessConfig method receives two strings, one holding the config
file and the other to put the result:

BOOL CProvisioning::processConfigXML(const CString& strConfig, CString&
strXmlOut)
{
        DWORD dwRet = 0;

         // Start a thread
        m_thrParam = ThreadParam(this, strConfig, strXmlOut);
        m_hProvThread =  CreateThread(
                NULL,
                0,
                &CProvisioning::provisioningThr,
                &m_thrParam,
                0, NULL);
   ...

}

/*static*/
DWORD CProvisioning::provisioningThr(LPVOID pvarg)
{
        ThreadParam* pThrParam = static_cast<ThreadParam*>(pvarg);
        if (pThrParam) {
                CProvisioning* pThis = pThrParam->pThis;
                return pThis->ProvisioningThr(pThis->m_thrParam.strConfig,
pThis->m_thrParam.strOut);
        }

        return -1;

}

DWORD CProvisioning::provisioningThr(const CString& strConfig, CString&
strXmlOut)
{
    // Some lengthy operations ...

    return 0;

}

The problem I get is with m_thrParam = ThreadParam(this, strConfig,
strXmlOut); because I get :

error C2582: 'operator =' function is unavailable in
'CProvisioning::ThreadParam'

1) First I don't understand why I need to overload =
2) How can I fix it ?

Beside reply by Victor else thread,
You can also have pointer as member instead of reference.
 
J

John Doe

Barry said:
Beside reply by Victor else thread,
You can also have pointer as member instead of reference.
I have replaced reference by pointers but it still doesn 't work :
class CProvisioning
{
public:
struct ThreadParam
{
ThreadParam(CProvisioning* a_pThis, const CString* a_strConfig,
CString* a_strXmlOut):
pThis(a_pThis),
pStrConfig( a_strConfig ),
pStrOut( a_strXmlOut ) {}

CProvisioning* pThis;
const CString* pStrConfig;
CString* pStrOut;
};
};

BOOL CProvisioning::processConfigXML(const CString& strConfig, CString&
strXmlOut)
{
DWORD dwRet = 0;

m_thrParam = ThreadParam(this, &strConfig, &strXmlOut);
//m_thrParam.pStrConfig equals {0x001e5af0}
//m_thrParam.pStrOut equals {0x000ac248}

...
}



but in

/*static*/
DWORD CProvisioning::provisioningThr(LPVOID pvarg)
{
ThreadParam* pThrParam = static_cast<ThreadParam*>(pvarg);
if (pThrParam) {
COmaProvisioning* pThis = pThrParam->pThis;
if (pThis)
{
//pThrParam->pStrConfig is != 0x001e5af0 ????
//pThrParam->pStrOut is != 0x000ac248????
return pThis->ProvisioningThr(
*pThis->m_thrParam.pStrConfig,
*pThis->m_thrParam.pStrOut);
}

}

return -1;
}

Address of pStrConfig and pStrOut are different from the one stored in
ProcessConfigXML.
Don't understand why ?
 
J

John Doe

John said:
I have replaced reference by pointers but it still doesn 't work :
class CProvisioning
{
public:
struct ThreadParam
{
ThreadParam(CProvisioning* a_pThis, const CString* a_strConfig,
CString* a_strXmlOut):
pThis(a_pThis),
pStrConfig( a_strConfig ),
pStrOut( a_strXmlOut ) {}

CProvisioning* pThis;
const CString* pStrConfig;
CString* pStrOut;
};
};

BOOL CProvisioning::processConfigXML(const CString& strConfig, CString&
strXmlOut)
{
DWORD dwRet = 0;

m_thrParam = ThreadParam(this, &strConfig, &strXmlOut);

..
}



but in

/*static*/
DWORD CProvisioning::provisioningThr(LPVOID pvarg)
{
ThreadParam* pThrParam = static_cast<ThreadParam*>(pvarg);
if (pThrParam) {
COmaProvisioning* pThis = pThrParam->pThis;
if (pThis)
{
return pThis->ProvisioningThr(
*pThis->m_thrParam.pStrConfig,
*pThis->m_thrParam.pStrOut);
}

}

return -1;
}

Address of pStrConfig and pStrOut are different from the one stored in
ProcessConfigXML.
Don't understand why ?
REALLY don't understand because m_thrParam address in ProcessConfigXML
and address received in DWORD CProvisioning::provisioningThr(LPVOID
pvarg) are the same but pointer contents are different

&m_thrParam 0x2e1dfc54 {pThis=0x2e1dfc54 pStrConfig=0x2e1d62c4
pStrOut=0x2e1d6290} CProvisioning::ThreadParam*

pThrParam 0x2e1dfc54 {pThis=0x2e1dfc54 pStrConfig=0x2e1d62c4
pStrOut=0x2e1d6290} CProvisioning::ThreadParam*

The problem is when debugging in ProcessConfigXML pStrConfig and
pStrOut holds valid data while in ProvisioningThr data is nonsense.
 
J

John Doe

John said:
REALLY don't understand because m_thrParam address in ProcessConfigXML
and address received in DWORD CProvisioning::provisioningThr(LPVOID
pvarg) are the same but pointer contents are different

&m_thrParam 0x2e1dfc54 {pThis=0x2e1dfc54 pStrConfig=0x2e1d62c4
pStrOut=0x2e1d6290} CProvisioning::ThreadParam*

pThrParam 0x2e1dfc54 {pThis=0x2e1dfc54 pStrConfig=0x2e1d62c4
pStrOut=0x2e1d6290} CProvisioning::ThreadParam*

The problem is when debugging in ProcessConfigXML pStrConfig and
pStrOut holds valid data while in ProvisioningThr data is nonsense.

I have finally replaced CString* in ThreadParam with LPCTSTR
and LPTSTR:

struct ThreadParam
{
ThreadParam(CProvisioning* a_pThis, LPCTSTR a_strConfig, LPTSTR
a_strXmlOut):
pThis(a_pThis),
pStrConfig( a_strConfig ),
pStrOut( a_strXmlOut ) {}

CProvisioning* pThis;
LPCTSTR pStrConfig;
LPTSTR pStrOut;
};



BOOL CProvisioning::processConfigXML(const CString& strConfig, CString&
strXmlOut)
{
DWORD dwRet = 0;

m_thrParam = ThreadParam(this, (LPCTSTR)strConfig,
(LPTSTR)(LPCTSTR)strXmlOut);
m_hProvThread = CreateThread(
NULL,
0,
&COmaProvisioning::provisioningThr,
&m_thrParam,
0, NULL);
....
}
/*static*/
DWORD CProvisioning::provisioningThr(LPVOID pvarg)
{
ThreadParam* pThrParam = static_cast<ThreadParam*>(pvarg);
if (pThrParam) {
COmaProvisioning* pThis = pThrParam->pThis;
if (pThis)
{
return pThis->ProvisioningThr(
CString(pThis->m_thrParam.pStrConfig),
CString(pThis->m_thrParam.pStrOut);
}
}

return -1;
}


but obviously now my reference string passed in ProcessConfigXML is not
modified since I pass a temporary reference
CString(pThis->m_thrParam.pStrOut.


Finally I am going to use old plain C interface LPCTSTR and LPSTR
because like this it works ...
I don 't understand why I try complicated things in C++
 
J

John Doe

I have finally replaced CString* in ThreadParam with LPCTSTR
and LPTSTR:

struct ThreadParam
{
ThreadParam(CProvisioning* a_pThis, LPCTSTR a_strConfig, LPTSTR
a_strXmlOut):
pThis(a_pThis),
pStrConfig( a_strConfig ),
pStrOut( a_strXmlOut ) {}

CProvisioning* pThis;
LPCTSTR pStrConfig;
LPTSTR pStrOut;
};



BOOL CProvisioning::processConfigXML(const CString& strConfig, CString&
strXmlOut)
{
DWORD dwRet = 0;

m_thrParam = ThreadParam(this, (LPCTSTR)strConfig,
(LPTSTR)(LPCTSTR)strXmlOut);
m_hProvThread = CreateThread(
NULL,
0,
&COmaProvisioning::provisioningThr,
&m_thrParam,
0, NULL);
...
}
/*static*/
DWORD CProvisioning::provisioningThr(LPVOID pvarg)
{
ThreadParam* pThrParam = static_cast<ThreadParam*>(pvarg);
if (pThrParam) {
COmaProvisioning* pThis = pThrParam->pThis;
if (pThis)
{
return pThis->ProvisioningThr(
CString(pThis->m_thrParam.pStrConfig),
CString(pThis->m_thrParam.pStrOut);
}
}

return -1;
}


but obviously now my reference string passed in ProcessConfigXML is not
modified since I pass a temporary reference
CString(pThis->m_thrParam.pStrOut.


Finally I am going to use old plain C interface LPCTSTR and LPSTR
because like this it works ...
I don 't understand why I try complicated things in C++

Hum I thinl I have understood why it couldn't work:


LPTSTR szXmlIn = NULL;
CString strXmlFmtOut;

m_OmaProv.ProcessConfigXML(szXmlIn, strXmlFmtOut);

When I call ProcessConfigXML , first argument is a C char array =>
CString objects are create temporarly then I save a pointer to ths
temporary object :

BOOL CProvisioning::processConfigXML(const CString& strConfig, CString&
strXmlOut)
{
m_thrParam = ThreadParam(this, &strConfig, &strXmlOut);
....
}
So I suppose address of &strConfig is temporary ...

Am I wrong ?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,021
Latest member
AkilahJaim

Latest Threads

Top