|
Guys i am declaring two C++ classes in a single header file. My code is something like this:
class A
{
class B;
friend class B;
B sum;
};
class B : public something
{
};
But on compiling, the compiler is giving me following error:
: error C2079: 'sum' uses undefined class 'B'
Can any one tell me whats the problem ????
|
|
|
|
|
How can the poor compiler know that later in the file class B gets declared and defined?
At the moment where he need it, he does not find an entry for class B in his table of known identifiers.
Solution:
Add a line
class B;
just before your class A. That is called a 'forward declaration'.
This way, he finds an entry for B and is happy (for now...)
My opinions may have changed, but not the fact that I am right.
|
|
|
|
|
I know about forward declaration, and ofcourse i am doing whatever you said, but your suggestion not worked. Try it yourself, just create a simple console app and add the following code in some header file:
class B;
class A
{
public:
class B;
friend class B;
A();
virtual ~A();
B sum;
};
class B
{
};
|
|
|
|
|
Use B *sum; .
As the compiler said, it cannot allocate a member that has not been defined at compile time.
rechi
|
|
|
|
|
You can treat forward declarations as a promise to the compiler that in
some other obj file the full declaration will be provided. Otherwise you will
get unresolved external symbols.
If you try to make an instance of class B inside class A will not work
because at this moment the ctor of B must be already declared.
|
|
|
|
|
When the compiler is allocating the data space for class A, it needs to know the exact size of each of the objects that make it up. If you have a B sum; in class A's declaration, the compiler needs to know its exact size, which is currently not defined. This is an error. If it was declared as B* sum , the compiler knows the size of a pointer to an object, so can work out how big class A is going to be. This is OK.
If you still need to declare class A with a B sum then you will have to move the declration of class B before class A. But as you said in your original post, class B will be referencing class A in some way. If both do somthing like B sum and A total then one of your classes will have to use a pointer to the object otherwise you will not be able to get the code to compile due to a circular definition.
Roger Allen
Sonork 100.10016
Were you different as a kid? Did you ever say "Ooohhh, shiny red" even once? - Paul Watson 11-February-2003
|
|
|
|
|
I'm hooking another app and subclassing it. When I work with the WM_GETMINMAXINFO msg and set the MINMAXINFO data then return 0, my settings are overriden by the app if my ptMinTrackSize.x or ptMinTrackSize.y are less than what the app allows. Basically, what I'm asking is, how is the app setting the min and max window size if I'm overriding the WM_GETMINMAXINFO msg and returning 0?
|
|
|
|
|
You should be able to shrink app to:
Y = GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYDLGFRAME);
X = n*GetSystemMetrics(SM_CYDLGFRAME);
Boyond that requires patching OnNcCalcSize
|
|
|
|
|
Hi
If I have a number of radi buttons on a dialog that are grouped together clicking on one unclicks the others. Using SetCheck for a button however from in the code leaves the others unchanged ie checked if they were the previously selected button.
Is there a way to easily achieve the same functionality of clicking from within the code ?
|
|
|
|
|
Perhaps calling CWnd's CheckRadioButton helps?
|
|
|
|
|
How can I replace CSpinButton inside TabCtrl????
Cann't use "PreSubclassWindow()" as control may not be created at that time?
May be someone has ideas how to detect when CTabCtrl created Spin?
Thanks,
Brian
|
|
|
|
|
The spin button sends a WM_PARENTNOTIFY msg to the tab control when it's created. If the low order word of wParam is WM_CREATE then get the child control's class name (lParam is a pointer to the child's HWND). If the class name is "msctls_updown32" then you hit the jackpot
|
|
|
|
|
Thanks, worked like a charm....
One more question... If I want to hide Spin, what would be the best way to do this...
|
|
|
|
|
subclass the spin control and then on WM_WINDOWPOSCHANGING set the flags like this:
((LPWINDOWPOS)lParam)->flags &= ~SWP_SHOWWINDOW;
((LPWINDOWPOS)lParam)->flags |= SWP_HIDEWINDOW;
|
|
|
|
|
Hi
I'm trying to do some work with AVI files using Visual C++ 5.0 while running Win XP. I've been having a lot of problem and a few posts I've seen suggest that I'll need to upgrade to version 6.0 to use some of the features in XP for AVI's.
Does anyone know if this is actually the case?
Confused Kenny
|
|
|
|
|
Is it possible to block packets(Forcing them not to reach their destination)using Winsock API. Plz provide relevent sites containing the help and the source codes.
Reply me soon
|
|
|
|
|
Hello all,
In my project I want to scroll a web page pixel by pixel.
currently i do :
<code>IDispatch *pDisp = GetHtmlDocument();
IHTMLDocument2 *pDocument = NULL;
pDisp->QueryInterface( IID_IHTMLDocument2, ( void** )&pDocument );
IHTMLElement* pBody = NULL;
pDocument->get_body (&pBody );
IHTMLElement2* pBody2 = NULL;
pBody->QueryInterface(IID_IHTMLElement2,reinterpret_cast<void**>(&pBody2));
long ScrollX = 0;
long ScrollY = 0;
long ScrollHeight = 0;
long ScrollWidth = 0;
pBody2->get_scrollHeight(&ScrollHeight);
pBody2->get_scrollWidth(&ScrollWidth);
while(1)
{
..
..
if (ScrollX == ScrollWidth)
{
ScrollX = -1;
ScrollY++;
}
pWindow->scrollTo(ScrollX++,ScrollY);
}</code>
at the beginning it is fast but progressively it is increasingly slow !
, you know how scroll document fastest ?;)
|
|
|
|
|
NetShareEnum fails on calls to machines that are not members of the last domain enumerated by NetServerEnum...
For example, I have a treeview that behaves much like Windows Explorer... the treeview's constructor calls NetServerEnum, which enumerates the 2 domains on my network, and displays each as a node in the treeview...
clicking on a domain node calls NetServerEnum again to enumerate all the machines on that domain... so far so good..
clicking on a machine calls NetShareEnum to enumerate all shared resources on that machine...
My problem is that NetShareEnum only succeeds for machines on the second (last) domain...if I click on a machine under the first domain, I get a return val of 53 - "network path not found"
There is no provision in NetShareEnum to specify a domain, so I'm wondering if I have to call NetServerEnum (just before NetShareEnum) for the desired domain, so I have the right context...???
thanks for any help.
|
|
|
|
|
i want adjust a dialog and his child dialog position,to make them match.
thanks!
|
|
|
|
|
See CDialog::PreCreateWindow() and CREATESTRUCT.
Jon
#include <beer.h>
|
|
|
|
|
You can use SetWindowPos to move the child dialog. I usually put a (non visible)
static control on the parent dialog to be replaced / superimposed by the child
dialog. Roughly:
class CParentDlg
{
...
CChildDialog m_Child;
...
};
BOOL CParentDlg::OnInitDialog ()
{
...
CRect rcStatic, rcChild;
GetDlgItem (IDS_PLACEHOLDER)->GetWindowRect (&rcStatic);
ScreenToClient (&rcStatic);
m_Child.Create (...);
m_Child.GetWindowRect (&rcChild);
ScreenToClient (&rcChild);
m_Child.SetWindowPos (GetDlgItem (IDS_PLACEHOLDER),
rcStatic.left + (rcStatic.Width () - rcChild.Width ())/2,
rcStatic.top + (rcStatic.Height () - rcChild.Height ())/2,
0,0, SWP_NOSIZE);
....
}
I hope that helps. The bit of maths makes the child dialog centre at the same
point as the static centre. Another thing to watch is to set the "Control Parent"
style, so you can tab "through" the child dialog.
Iain.
|
|
|
|
|
I have 2 file list window which are "1FileListCtrl" and "2FileListCtrl"
and I have 2 radio. If I check radio one, I expect 2FileListCtrl window is disable but it is not disable. Do you know how to solve my problem?
These below is my code (when I check radio one)
void CTestView::OnKeyfileRadio() <br />
{<br />
UpdateData(TRUE);<br />
if (m_keySrc == 0) {<br />
1FileListCtrl.EnableWindow(TRUE);<br />
2FileListCtrl.EnableWindow(FALSE);<br />
}<br />
UpdateData(FALSE);<br />
}
This is my picture problem
http://www.geocities.com/foruonlyna/1.JPG
|
|
|
|
|
You code seems to be ok. So you could check if your call to UpdateData(TRUE) is succesfull. And are you sure that 2FileListCtrl is connected to the window you expect it to be? Or do you have another handler for your 2nd radio box, which possibly re-enables your window?
|
|
|
|
|
m_keySrc is your problem. solution:
ooosawaddee3 wrote:
//if (m_keySrc == 0) {
1FileListCtrl.EnableWindow(TRUE);
2FileListCtrl.EnableWindow(FALSE);
//}
|
|
|
|
|
Lazy programmer is looking for way to automate removal of unused code from my MFC VC++ files. Not looking for code beautifier / formater - my code is beyond help here! Willing to build my own but have a little experience in this field. Any constructive suggestions welcomed. Thanks
Vaclav
|
|
|
|