一个类 用指针实例化和用对象实例化有什么区别?

时间:2021-09-27 09:21:35
我以为一个类 如果里面有指针需要分配内存 要用指针实例化
//***************************************************************
//对象实例化
class mywin:public CWinApp
{
public :
BOOL InitInstance()
{
myframe *my;
my=new myframe;
my->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd=my;

return TRUE;
}
};

mywin a;
//********************************************************
以上没有问题
以下却不行???????????????????
//***************************************************************
//指针实例化
class mywin:public CWinApp
{
public :
BOOL InitInstance()
{
myframe *my;
my=new myframe;
my->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd=my;

return TRUE;
}
};

mywin *a;
a=new mywin;
a->InitInstance();
//********************************************************

22 个解决方案

#1


我顶,高手这个问题困惑我好久了,分不够再加

#2


关注

#3


不知道你要问的是什么?
mywin a;-〉调用构造函数实例化

mywin *a;-〉申明一个指向mywin类对象的指针
a=new mywin; -〉将指针指向一个new 的 mywin 类型的对象
这两种都是可以的
你不会把

mywin *a;
a=new mywin;
a->InitInstance();
放到*.cpp直接去编译吧,要放到函数中去

#4


*****************************************
BOOL InitInstance()
{
myframe *my;
my=new myframe;
my->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd=my;

return TRUE;
}
***********************************************************
这个我可以改成
************************************************************
BOOL InitInstance()
{
myframe my;
//my=new myframe;
my.ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd=&my;

return TRUE;
}
*********************************************************
好象不行

#5


楼主想的还真仔细

#6


楼上说的很清楚了啊。估计他就是没放到函数中直接new了

#7


你第一个认为正确的程序好像没有写完阿,mywin a;然后呢?你写了什么??

#8


是的
就是手写的mfc 的程序
四个类

#9


#include <afxwin.h>
#include <afxext.h>
#include "resource.h"

UINT tool[]=
{
ID_SHAPES_RECTANGLE,
    ID_SHAPES_CIRCLE,
ID_SHAPES_LINE
};

UINT stat[]=
{
0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS
};

class myframe:public CFrameWnd
{
public:
CToolBar t;
CStatusBar s;
char shape;
    int width;
char tag;

myframe()
{
Create(0,"Hello",WS_OVERLAPPEDWINDOW,(CRect)0,0,
MAKEINTRESOURCE(IDR_MENU1));
shape='s';
width=1;
tag='t';
}

BOOL OnCreateClient(CREATESTRUCT *c,CCreateContext *p)
{
t.Create(this);
s.Create(this);
t.LoadBitmap(IDB_BITMAP1);

t.SetButtons(tool,4);

s.SetIndicators(stat,3);
return TRUE;
}



void rect()
{
shape='r';

Invalidate();
}

void circ()
{
shape='c';
Invalidate();
}

void line()
{
shape='l';
Invalidate();
}

void thin()
{
width=2;
}

void thick()
{
width=5;
}

void solid()
{
tag='s';
}

void pattern()
{
tag='h';
}

void OnPaint()
{
CPaintDC d(this);
CPen *p;
p=new CPen;
p->CreatePen(PS_SOLID,width,RGB(255,0,0));
d.SelectObject(p);

CBitmap *k;
k=new CBitmap;
k->LoadBitmap (IDB_BITMAP2);

        CBrush *b;
b=new CBrush;
if(tag=='h')
b->CreatePatternBrush(k); 
    else if(tag=='s')
b->CreateSolidBrush (RGB(0,0,255));
if(shape=='r')
{
d.Rectangle(0,0,200,200);

}
else if(shape=='c')
{
d.Ellipse (100,120,200,220);
}
else if(shape=='l')
{
d.MoveTo (100,100);
    d.LineTo (200,400);

}
}

DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(myframe,CFrameWnd)
  ON_COMMAND(ID_SHAPES_CIRCLE,circ)
  ON_COMMAND(ID_SHAPES_LINE,line)
  ON_COMMAND(ID_SHAPES_RECTANGLE,rect)
  ON_COMMAND(ID_OBJECTS_PEN_THIN,thin)
  ON_COMMAND(ID_OBJECTS_PEN_THICK,thick)
  ON_COMMAND(ID_OBJECTS_BRUSH_PATTERNED,pattern)
  ON_COMMAND(ID_OBJECTS_BRUSH_SOLID,solid)
  ON_WM_PAINT()
END_MESSAGE_MAP()
class mywin:public CWinApp
{
public :
BOOL InitInstance()
{
myframe *my;
my=new myframe;
my->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd=my;

return TRUE;
}
};

mywin a;
***************************
全部程序如上

#10


虽然我不会,不过想要那么一分

#11


我在一楼是写错了,不过在五楼改了一下,因为我在敲一些书的代码,运行没问提,我想改一下,就不行。

#12


mywin *a;
a=new mywin;
a->InitInstance();
这段代码放在什么位置的?
如果放在mywin a;的位置做的替换的话肯定不行三
这和类里面有指针什么的完全没有关系。

#13


#include <afxwin.h>
#include <afxext.h>
#include "resource.h"

UINT tool[]=
{
ID_SHAPES_RECTANGLE,
    ID_SHAPES_CIRCLE,
ID_SHAPES_LINE
};

UINT stat[]=
{
0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS
};

class myframe:public CFrameWnd
{
public:
CToolBar t;
CStatusBar s;
char shape;
    int width;
char tag;

myframe()
{
Create(0,"Hello",WS_OVERLAPPEDWINDOW,(CRect)0,0,
MAKEINTRESOURCE(IDR_MENU1));
shape='s';
width=1;
tag='t';
}

BOOL OnCreateClient(CREATESTRUCT *c,CCreateContext *p)
{
t.Create(this);
s.Create(this);
t.LoadBitmap(IDB_BITMAP1);

t.SetButtons(tool,4);

s.SetIndicators(stat,3);
return TRUE;
}



void rect()
{
shape='r';

Invalidate();
}

void circ()
{
shape='c';
Invalidate();
}

void line()
{
shape='l';
Invalidate();
}

void thin()
{
width=2;
}

void thick()
{
width=5;
}

void solid()
{
tag='s';
}

void pattern()
{
tag='h';
}

void OnPaint()
{
CPaintDC d(this);
CPen *p;
p=new CPen;
p->CreatePen(PS_SOLID,width,RGB(255,0,0));
d.SelectObject(p);

CBitmap *k;
k=new CBitmap;
k->LoadBitmap (IDB_BITMAP2);

        CBrush *b;
b=new CBrush;
if(tag=='h')
b->CreatePatternBrush(k); 
    else if(tag=='s')
b->CreateSolidBrush (RGB(0,0,255));
if(shape=='r')
{
d.Rectangle(0,0,200,200);

}
else if(shape=='c')
{
d.Ellipse (100,120,200,220);
}
else if(shape=='l')
{
d.MoveTo (100,100);
    d.LineTo (200,400);

}
}

DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(myframe,CFrameWnd)
  ON_COMMAND(ID_SHAPES_CIRCLE,circ)
  ON_COMMAND(ID_SHAPES_LINE,line)
  ON_COMMAND(ID_SHAPES_RECTANGLE,rect)
  ON_COMMAND(ID_OBJECTS_PEN_THIN,thin)
  ON_COMMAND(ID_OBJECTS_PEN_THICK,thick)
  ON_COMMAND(ID_OBJECTS_BRUSH_PATTERNED,pattern)
  ON_COMMAND(ID_OBJECTS_BRUSH_SOLID,solid)
  ON_WM_PAINT()
END_MESSAGE_MAP()
class mywin:public CWinApp
{
public :
BOOL InitInstance()
{
myframe my;//**************
//my=new myframe;//**********************
my.ShowWindow(SW_SHOWMAXIMIZED);//******************
m_pMainWnd=&my;//**********************

return TRUE;
}
};

mywin a;
***************************
改成这个程序后没错误,但程序一闪而过

#14


该贴的分数加到100分

#15


用指针实例化,还是对象实例化,和类的内部实现没关系

指针实例化后要delete

#16


程序一闪而过是因为你的InitInstance()定义了局部的myframe my,一旦退出函数my就析构了。

你所说的不行是什么不行?编译?运行?出什么样子的错?
mywin *a;
a=new mywin;
////////////->InitInstance();去掉这一行试试。

#17


我也顶,高手给详细讲讲好么?我也困惑多年了!

#18


退出函数my就析构了 是的 但是
m_pMainWnd=&my;
把地址记下来了

#19


我顶我顶高手请举例说明

#20


用变量方式时,my是局部变量,在InitInstance()结束后就销毁了,所保存的m_pMainWnd也成了无效指针...用new时,窗口不会被销毁,如是而已!

#21


感谢大家的指教

#22


来晚了

#1


我顶,高手这个问题困惑我好久了,分不够再加

#2


关注

#3


不知道你要问的是什么?
mywin a;-〉调用构造函数实例化

mywin *a;-〉申明一个指向mywin类对象的指针
a=new mywin; -〉将指针指向一个new 的 mywin 类型的对象
这两种都是可以的
你不会把

mywin *a;
a=new mywin;
a->InitInstance();
放到*.cpp直接去编译吧,要放到函数中去

#4


*****************************************
BOOL InitInstance()
{
myframe *my;
my=new myframe;
my->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd=my;

return TRUE;
}
***********************************************************
这个我可以改成
************************************************************
BOOL InitInstance()
{
myframe my;
//my=new myframe;
my.ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd=&my;

return TRUE;
}
*********************************************************
好象不行

#5


楼主想的还真仔细

#6


楼上说的很清楚了啊。估计他就是没放到函数中直接new了

#7


你第一个认为正确的程序好像没有写完阿,mywin a;然后呢?你写了什么??

#8


是的
就是手写的mfc 的程序
四个类

#9


#include <afxwin.h>
#include <afxext.h>
#include "resource.h"

UINT tool[]=
{
ID_SHAPES_RECTANGLE,
    ID_SHAPES_CIRCLE,
ID_SHAPES_LINE
};

UINT stat[]=
{
0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS
};

class myframe:public CFrameWnd
{
public:
CToolBar t;
CStatusBar s;
char shape;
    int width;
char tag;

myframe()
{
Create(0,"Hello",WS_OVERLAPPEDWINDOW,(CRect)0,0,
MAKEINTRESOURCE(IDR_MENU1));
shape='s';
width=1;
tag='t';
}

BOOL OnCreateClient(CREATESTRUCT *c,CCreateContext *p)
{
t.Create(this);
s.Create(this);
t.LoadBitmap(IDB_BITMAP1);

t.SetButtons(tool,4);

s.SetIndicators(stat,3);
return TRUE;
}



void rect()
{
shape='r';

Invalidate();
}

void circ()
{
shape='c';
Invalidate();
}

void line()
{
shape='l';
Invalidate();
}

void thin()
{
width=2;
}

void thick()
{
width=5;
}

void solid()
{
tag='s';
}

void pattern()
{
tag='h';
}

void OnPaint()
{
CPaintDC d(this);
CPen *p;
p=new CPen;
p->CreatePen(PS_SOLID,width,RGB(255,0,0));
d.SelectObject(p);

CBitmap *k;
k=new CBitmap;
k->LoadBitmap (IDB_BITMAP2);

        CBrush *b;
b=new CBrush;
if(tag=='h')
b->CreatePatternBrush(k); 
    else if(tag=='s')
b->CreateSolidBrush (RGB(0,0,255));
if(shape=='r')
{
d.Rectangle(0,0,200,200);

}
else if(shape=='c')
{
d.Ellipse (100,120,200,220);
}
else if(shape=='l')
{
d.MoveTo (100,100);
    d.LineTo (200,400);

}
}

DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(myframe,CFrameWnd)
  ON_COMMAND(ID_SHAPES_CIRCLE,circ)
  ON_COMMAND(ID_SHAPES_LINE,line)
  ON_COMMAND(ID_SHAPES_RECTANGLE,rect)
  ON_COMMAND(ID_OBJECTS_PEN_THIN,thin)
  ON_COMMAND(ID_OBJECTS_PEN_THICK,thick)
  ON_COMMAND(ID_OBJECTS_BRUSH_PATTERNED,pattern)
  ON_COMMAND(ID_OBJECTS_BRUSH_SOLID,solid)
  ON_WM_PAINT()
END_MESSAGE_MAP()
class mywin:public CWinApp
{
public :
BOOL InitInstance()
{
myframe *my;
my=new myframe;
my->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd=my;

return TRUE;
}
};

mywin a;
***************************
全部程序如上

#10


虽然我不会,不过想要那么一分

#11


我在一楼是写错了,不过在五楼改了一下,因为我在敲一些书的代码,运行没问提,我想改一下,就不行。

#12


mywin *a;
a=new mywin;
a->InitInstance();
这段代码放在什么位置的?
如果放在mywin a;的位置做的替换的话肯定不行三
这和类里面有指针什么的完全没有关系。

#13


#include <afxwin.h>
#include <afxext.h>
#include "resource.h"

UINT tool[]=
{
ID_SHAPES_RECTANGLE,
    ID_SHAPES_CIRCLE,
ID_SHAPES_LINE
};

UINT stat[]=
{
0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS
};

class myframe:public CFrameWnd
{
public:
CToolBar t;
CStatusBar s;
char shape;
    int width;
char tag;

myframe()
{
Create(0,"Hello",WS_OVERLAPPEDWINDOW,(CRect)0,0,
MAKEINTRESOURCE(IDR_MENU1));
shape='s';
width=1;
tag='t';
}

BOOL OnCreateClient(CREATESTRUCT *c,CCreateContext *p)
{
t.Create(this);
s.Create(this);
t.LoadBitmap(IDB_BITMAP1);

t.SetButtons(tool,4);

s.SetIndicators(stat,3);
return TRUE;
}



void rect()
{
shape='r';

Invalidate();
}

void circ()
{
shape='c';
Invalidate();
}

void line()
{
shape='l';
Invalidate();
}

void thin()
{
width=2;
}

void thick()
{
width=5;
}

void solid()
{
tag='s';
}

void pattern()
{
tag='h';
}

void OnPaint()
{
CPaintDC d(this);
CPen *p;
p=new CPen;
p->CreatePen(PS_SOLID,width,RGB(255,0,0));
d.SelectObject(p);

CBitmap *k;
k=new CBitmap;
k->LoadBitmap (IDB_BITMAP2);

        CBrush *b;
b=new CBrush;
if(tag=='h')
b->CreatePatternBrush(k); 
    else if(tag=='s')
b->CreateSolidBrush (RGB(0,0,255));
if(shape=='r')
{
d.Rectangle(0,0,200,200);

}
else if(shape=='c')
{
d.Ellipse (100,120,200,220);
}
else if(shape=='l')
{
d.MoveTo (100,100);
    d.LineTo (200,400);

}
}

DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(myframe,CFrameWnd)
  ON_COMMAND(ID_SHAPES_CIRCLE,circ)
  ON_COMMAND(ID_SHAPES_LINE,line)
  ON_COMMAND(ID_SHAPES_RECTANGLE,rect)
  ON_COMMAND(ID_OBJECTS_PEN_THIN,thin)
  ON_COMMAND(ID_OBJECTS_PEN_THICK,thick)
  ON_COMMAND(ID_OBJECTS_BRUSH_PATTERNED,pattern)
  ON_COMMAND(ID_OBJECTS_BRUSH_SOLID,solid)
  ON_WM_PAINT()
END_MESSAGE_MAP()
class mywin:public CWinApp
{
public :
BOOL InitInstance()
{
myframe my;//**************
//my=new myframe;//**********************
my.ShowWindow(SW_SHOWMAXIMIZED);//******************
m_pMainWnd=&my;//**********************

return TRUE;
}
};

mywin a;
***************************
改成这个程序后没错误,但程序一闪而过

#14


该贴的分数加到100分

#15


用指针实例化,还是对象实例化,和类的内部实现没关系

指针实例化后要delete

#16


程序一闪而过是因为你的InitInstance()定义了局部的myframe my,一旦退出函数my就析构了。

你所说的不行是什么不行?编译?运行?出什么样子的错?
mywin *a;
a=new mywin;
////////////->InitInstance();去掉这一行试试。

#17


我也顶,高手给详细讲讲好么?我也困惑多年了!

#18


退出函数my就析构了 是的 但是
m_pMainWnd=&my;
把地址记下来了

#19


我顶我顶高手请举例说明

#20


用变量方式时,my是局部变量,在InitInstance()结束后就销毁了,所保存的m_pMainWnd也成了无效指针...用new时,窗口不会被销毁,如是而已!

#21


感谢大家的指教

#22


来晚了