|
Is it a good idea to always put a copy constructor in your class? Even if you are not gonna do a copy like:
CFoo a;
CFoo b(a);
|
|
|
|
|
yes+no
When designing the class, which behavior the class should expose on copy. So you might need:
a) the default copy constructor (i.e. add don't add your own)
b) your own copy-constructor, if the default one makes something wrong/unwanted
c) a protected or private "do-nothing" copy constructor, if th class isn't copyable
Flirt harder, I'm a coder.
mlog || Agile Programming | doxygen
|
|
|
|
|
"Always" is such a strong word. As the previous reply said, if you don't define one, one is created for you. It's important for you to define one if the default behavior won't work for you. The perfect example of this is if your class includes a pointer to an object on the heap:
class CFoo {
...
CBar* m_pBar;
};
The default copy constructor will just copy the pointer, so you'll end up with two CFoo objects pointing to the same CBar object on the heap. This can result in ugly crashes if the destructor includes deleting the CBar object. So, in this case you will want to define your own copy constructor that will make a copy of the CBar object.
There's one more theory on all this. If you have a really large class with a lot of member variables and items on the heap you won't necessarily want the user of your class to be able to copy it as this will lead to poor performance. So, instead in the private section of your class declaration, declare your Copy constructor but never define it:
CFoo {
...
CFoo(const CFoo&);
};
Thus, anytime you or another future programmer accidentally calls the copy constructor on your huge class the compiler will disallow it. So, the short answer, no it's not always a good idea.
|
|
|
|
|
A copy ctor is used to instantiate an object of a class with a copy of another object of that same class. i.e. If I wanted a CPoint that had the same values as another CPoint (say, one I wouldn't want to modify), then I would do the following:
foo(const CPoint& pt)
{
CPoint MyPoint(pt);
...
}
Thus you need to implement a ctor with the following prototype:
CMyClass(const CMyClass&)
And then set all the necessary class internals needed to represent a copy.
~Nitron.
ññòòïðïðB A start
|
|
|
|
|
Hi ,
I have to implement a mode function using C++ or C .
mode is the sample occuring most num of times
eg 10 samples
1 1 1 1 1 1 1 2 2 2
the mode is 1
I wanted to know if there is any library func i can use to achieve this ?
If not I would need hints for calculating it .
I mean do I need to have an array of a struct like
typedef struct {<br />
int num ;<br />
int occurence;<br />
}MODE_STRUCT ;
and then creat a variable
MODE_STRUCT values[NUM_SAMPLES] then load the samples and find the struct having occurence as highest ?
can it be done dynamically without having an array implementation?
Finally what do i pick if the data is bi-modal or multi-modal ?
|
|
|
|
|
One solution would be to sort the numbers in the set. Set a MaxOcc counter to 0, and a Occ counter to 0. Then iterate through the set incrementing the Occ counter each time a same number is encountered. When the next number is different, if the Occ counter is greater than the MaxOcc counter, set the MaxOcc counter to Occ counter, and reset Occ counter back to 0. Something like:
sort the numbers in the set
set MaxOcc = 0 ' the maximum value of Occ
set Occ = 1 ' the number of times this number has occurred
set LastNum = Num = first number in set
for each number in set
if Num != LastNum
if Occ > MaxOcc
set MaxOcc = Occ
end
set Occ = 1
else
increment Occ
endif
set Num = next number in set
next
A rich person is not the one who has the most, but the one that needs the least.
|
|
|
|
|
Thank you David. that really helped .
|
|
|
|
|
I've got an MFC aplication (VS6, SP 5) that reads and writes text files using CFile. The applcation was installed on an NT 4.0 box. That box was recently uppgraded to Win2k server. Now a process that use to take a few minutes now takes a few hours!
Are there any "gotchas" I should be aware of when migrating a NT app to Win2k?
TIA
|
|
|
|
|
Some of the way in which the lower level IO is handled for drives, especially SCSI drives, was changed in Windows 2000 Server and later.
Maybe your NT app did something REALLY inefficient like reading 1 byte at a time from the text file off the drive instead of reading a larger block of data into memory and then parsing through that one byte at a time.
If you can control the opening flags for CreateFile, then you can investigate if FILE_FLAG_SEQUENTIAL_SCAN was used as one of the file bufering flags.
In general, I have tailored the CreateFile calls to the activity expected to be performed on each file that is opened, and have not noticed any problems like yours in switching from one system to another.
|
|
|
|
|
Hi All!
I have subclass an edit control and all works fine.
The problem is when the compiling ends I have two warnings:
warning C4312: 'type cast' : conversion from 'LONG' to 'WNDPROC' of greater size.
warning C4311: 'type cast' : pointer truncation from 'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' to 'LONG'.
These warnings are from this code:
OldEditControl = (WNDPROC)SetWindowLong(GetDlgItem(hwnd, IDC_NUM), GWL_WNDPROC, (LONG)EditProc);
The strange is that on Win98 I don't have these warnings.
I have them on WinXP
What's wrong?
|
|
|
|
|
I am using MSVC++ 6.0 and MFC. I need to send message between two applications. I've registered a message via RegisterWindowMessage using the same string in two separate applications. The message has been sent with ::SendMessage(HWND_BROADCAST . . . and BroadcastSystemMessage, but the secnod application is not seeing the message. I can see that the message was sent by watching with Spy++.
I have attempted to watch for the message both through the messaging macro ON_REGISTERED_MESSAGE and by overriding the PreTranslateMessage method on both my view and application classes in the intended recipient.
Can anyone see what I'm doing wrong?
|
|
|
|
|
HWND_BROADCAST broadcasts messages to toplevel windows only, where are you trying to handle the message?
MFC doesn't route non command messages, so if you have a MFC app you will have to catch it in the frame window and not in the doc/view/app etc, then manually route it to the doc/view/app if you wan't to process the message there.
|
|
|
|
|
Thanks. I'll give that a try.
|
|
|
|
|
Is there a reason why the maximum buffer size for a TCHAR seems to be 121 WideChars (for me at least)? Is there a way to increase this size?
Cheers.
|
|
|
|
|
How are you allocating your buffer?
Michael
But you know when the truth is told,
That you can get what you want or you can just get old,
Your're going to kick off before you even get halfway through.
When will you realise... Vienna waits for you? - "The Stranger," Billy Joel
|
|
|
|
|
I'm declaring this:
_TCHAR temp[4000];
and then using it in a call to this:
int len2 = (int)strlen((char*)testLine)+1;
MultiByteToWideChar(
CP_UTF8,
0,
(char*)testLine,
len2,
(_TCHAR*)temp,
4000);
I've also tried to concat TCHAR onto TCHAR using pointers, but again it stops working when it reaches a size of 121 WideChars.
Thanks for your time,
Tom.
|
|
|
|
|
Does testLine have any /0 characters in it?
How is testLine defined is it a char[]?
I assume your app is being complied as _UNICODE?
Michael
But you know when the truth is told,
That you can get what you want or you can just get old,
Your're going to kick off before you even get halfway through.
When will you realise... Vienna waits for you? - "The Stranger," Billy Joel
|
|
|
|
|
Does testLine have any /0 characters in it?
No (unfortunately).
How is testLine defined is it a char[]?
char testLine[2000];
I assume your app is being complied as _UNICODE?
It is indeed.....
Cheers,
Tom.
|
|
|
|
|
If you've defined _UNICODE why don't you just use TCHAR's instead of mixing TCHAR's with char's and use the generic text mapping routines (_tcslen() instead of strlen()). If the _UNICODE identifier is found _tcslen() will resolve to wcslen() otherwise it's strlen(). Instead of using MultiByteToWideChar try using mbstowcs() it's simpler.
|
|
|
|
|
Originally I did just that, using all TCHAR's. Unfortunately, it again hit the buffer size of 121 and stopped concatonating.
It concats the whole lot in char's no problem, so I changed to this tactic and then tried to convert - same problem.
|
|
|
|
|
Hi!
Could I show an alternative message when I move the mouse over a button in my Visual C++ application (in a little floating yellow window)? How could I do it?
Thank you in advance
I have no idea
|
|
|
|
|
Interesting.
Try deriving a class from CButton and handle the mouse move message. If it is within the button control's rectangle, then show the message.
Kuphryn
|
|
|
|
|
Do you know how could I show a message in this way? I don't have idea about this.
Thank you!
|
|
|
|
|
|
Thank you, I didn't know its name
|
|
|
|