没有NEW出来的对象也可以用?

_Guest_Only 2002-12-24 09:23:45
#ifndef GUIH
#define GUIH
#include <Classes.hpp>
#include <Controls.hpp>
/*GUI.h*/
#include <StdCtrls.hpp>

class GUIOperation
{
public:
__fastcall GUIOperation();
void __fastcall GetUpdateData(AnsiString Field);
private:
};
extern PACKAGE GUIOperation* guio;
#endif

然后在另外一个文件中调用
#include "GUI.h"
GUIOperation* guio;

guio->GetUpdateData("abcd");
但我发现guio此时是NULL的!因为我忘记了写guio=new GUIOperation();
但函数却调用成功?这。。。。。。请各位解答
...全文
127 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Guest_Only 2003-01-01
  • 打赏
  • 举报
回复
TO 令狐冲:

我觉得没有必要为C++的一些缺点去辩护和因为JAVA的一些缺点而说它不如人意。我用的160M,C500的机子在同时打开WEBLOGIC和JBUILDER的时候常常会死机,但我还是一样要用JAVA,许多人也一样,因为JAVA许多地方的确是C++无法比拟的,而慢这个问题则是我们JAVA的用户心甘情愿忍受的。对于我说的那个问题你可以说用auto_ptr解决,那么我这个贴子所提的问题呢?难道每次涉及到这样的问题都要这样问一大通?(也许是我学的不精吧,但在JAVA至少我不会这样)。而且这个问题我觉得看上去好象是指针的问题,其实就是OO的问题;还有,多态方面。。。

我这样说也不是说JAVA就比C++好,的确两种东西各有各长和短,胡扯而已。。。
TopCat 2002-12-26
  • 打赏
  • 举报
回复
"担心什么时候delete了一个对象之后却发现原来这个对象所指向的另外一个对象没有被delete 。。。"

——这个用auto_ptr可以有效的解决。并且是异常安全的。 :)
TopCat 2002-12-26
  • 打赏
  • 举报
回复
这个应该涉及到的是Java中的GC吧,跟OO没什么关系。
Java虽然强大,但不是无所不能,它适于做符合它那个体系的事情,但对位于它这个体系之外的东东却无能为力。

C++是语言,不是平台,它兼顾了效率和设计,并且不提供平台相关的类库和特性(比如二进制标准、界面库、甚至GC等等)。而是让你自己根据需要去选用。比如界面,你可以用MFC、VCL(当然,这个不是纯C++的),也可以去用Qt、FLTK;二进制标准,用ATL也可以开发COM。GC库也有,虽然不是那么尽善尽美,如果你需要,那么就去用吧(STL的auto_ptr、boost的smart_ptr也可以解决一部分指针问题)。但是语言本身不作这些工作。

事实上Java的GC也不尽如人意吧,看看一个Java程序启动之后要占用多少内存……oh, my god...
_Guest_Only 2002-12-26
  • 打赏
  • 举报
回复
令狐冲的解释我觉得还是比较满意的,当时我也想过可能是因为没有用到那个
guio,所以没有出错,只是没有想到这样去推论。。。
我发现这个问题的时候是一个意外,因为我要delete guio的时候发现我漏了去new,但却运作正常。。。

to PPower:不管怎么说,越来越多人喜欢JAVA的确是有原因的。在OO方面,C++的确不及JAVA,但最重要的原因,是因为用了JAVA之后你会有解放的感觉,比如说这样的情况不会出现,又比如说不用再担心什么时候delete了一个对象之后却发现原来这个对象所指向的另外一个对象没有被delete 。。。
勉励前行 2002-12-25
  • 打赏
  • 举报
回复
目前雖然可以這樣做,但不建議這樣寫程序。

因為不符合面向對象的觀點,它使得對象的封裝有個默認的協定:不使用類中的數據,而寫這個對象的程序員可不管那麼多的啊。

因為,不知哪一天,這個對象重寫該方法,使用了數據區,這時什麼錯誤都可能發生。
勉励前行 2002-12-25
  • 打赏
  • 举报
回复
類的方法:
void __fastcall GUIOperation::GetUpdateData(AnsiString Field)
沒有使用類的數據區,可以調用。

類的方法:
__fastcall GUIOperation::GUIOperation()
{
m = "hi";//头文件里定义为公有变量,如果m是靜態的公有變量,另當別論
}
如果GUIOperation沒有被構造,使用GUIOperation()方法,可能(不一定)會產生一個異常。
char buff[1280];
GUIOperation* guio;
guio = (GUIOperation*)buff;
guio->GUIOperation();//這樣“可能”產生異常,去掉上面一行,肯定有異常。
_Guest_Only 2002-12-25
  • 打赏
  • 举报
回复
to:ouygg
这个guio的确是NULL的。我跟踪过的,执行guio->GetUpdateData("abcd");之后仍然是NULL

to:PPower
使用了类里的变量依然可以。请看:
__fastcall GUIOperation::GUIOperation()
{
m="hi";//头文件里被定义为公有变量
}
void __fastcall GUIOperation::GetUpdateData(AnsiString Field)
{
Form3->GroupBox1->Caption="更改 ["+Field+"] 为下列内容:";
Form3->ShowModal();
ShowMessage(m);
}

我觉得是BUG,不知道为什么BCB自己为这个指针guio分配了空间。
Behard 2002-12-25
  • 打赏
  • 举报
回复
mark
TopCat 2002-12-25
  • 打赏
  • 举报
回复
hehe, 规范当然是要守得,不过有些问题也是值得研究研究的,研究而已 :)
googoler 2002-12-25
  • 打赏
  • 举报
回复
to PPower()

程序員編程時要守規范,不要為達目的,不擇手段。
------------------------------------------
何止是守規范,代码编写也要整洁,俺看到那些
for(int i=0;i<1000;i++){for(int j=0;j<10000;j++){.......}}
诸如此类,俺头就晕了!

俺当头时做的第一件事就是要求程序员写代码时要写得看上去 清晰 一点!
痞子酷 2002-12-25
  • 打赏
  • 举报
回复
#include "GUI.h"
GUIOperation* guio; //guio的指针不一定为NULL,而是为任意值.一般在cb中采用这种方式:GUIOperation* guio=NULL;

guio->GetUpdateData("abcd");
cwsheng 2002-12-25
  • 打赏
  • 举报
回复
guio->GetUpdateData("abcd");这个函数是static的吧?
勉励前行 2002-12-25
  • 打赏
  • 举报
回复
這裡涉及函數的調用方式,一個class在內存中的布局,Virtual table 的實現方法,有些情況可以使用類中靜態成員的,但也與具體的編譯器有關。
googoler() 所說方法中安全的。因為函數被定義成static的了。
有些人就批評說C++沒有真正地面向對象,不象Java,但不管別人怎麼說,找到了函數入口就能運作那個函數,知道了對象在內存中的布局,就能透過對象的封裝,只是

程序員編程時要守規范,不要為達目的,不擇手段。
googoler 2002-12-25
  • 打赏
  • 举报
回复
to PPower()

哎,俺白干了一个多钟!
googoler 2002-12-25
  • 打赏
  • 举报
回复
对,TopCat(令狐虫) 说得对!

static对函数是一样的!
勉励前行 2002-12-25
  • 打赏
  • 举报
回复
我記得以前有過討論,這是可以的,不是BUG.
要求被調用的函數沒使用到類中的數據(私有,公有或繼承而來的,連this這個指針都不用),就能正確運作, VC BC 都一樣的,好象是在C/C++論壇的吧。
TopCat 2002-12-25
  • 打赏
  • 举报
回复
to googoler():

static函数和nonstatic函数的区别就在于最后那个隐藏的this参数。其他其实是一样的。
TopCat 2002-12-25
  • 打赏
  • 举报
回复
这个现象是正常的,我认为不是BCB的bug。我们知道,
#include <iostream>
using namespace std;

class A
{
public:
int GetX() { return 0; };
void SetX(int x) { _x = x; };
private:
int _x;
};

相当于:
struct A
{ A_GetX(A *this); //函数名有转换
private: +
int _x; A_SetX(int x, A *this);
}

因此,你写:
A *a = NULL;
a->GetX();

相当于:
A_GetX(a); ==> A_GetX(NULL);

因为上面我写的那个函数体:return 0 根本没用到this,所以这个调用不会出错。

那么,如果调用这个呢?
A *a = NULL;
a->SetX(13);

这个相当于:
A_SetX(13, a) ==> A_SetX(13, NULL);

因为这个函数体里用到了this: this->_x = x; ==> NULL->_x = 13; 这时,就会出错了。

我希望这样的解释能让大家满意。
googoler 2002-12-25
  • 打赏
  • 举报
回复
从97年开始,偶基本上就没看过C++书了。不知道以后的C++标准又改了些什么。

是不是加了_Guest_Only (客人) 所提到的问题属于正常现象

还请各位高手斧正!
googoler 2002-12-25
  • 打赏
  • 举报
回复
偶是1996年底开始学C++,当时用的是borland turbo c++3.0

偶非常清除的记得有一本书是这样教我的!
如果要访问一个还未创建的对象的成员或成员函数!(现在叫属性和方法)
必需将成员和成员函数定义为static。
然后在类的外部通过 类名::成员函数 或者 类名::成员函数名 访问

类似于
class A
{
public:
static int i;
int j;
static int sum(int a,int b);
};

在应用中,我们随时可以通过A::i和A::sum()去访问成员i和成员函数sum;

我不知道有多少人在实际应用中使用过 :: 运算符

从以上判断, _Guest_Only (客人) 所提到的问题应该是bug。否则C++没有必要提供::运算符,多余了吗!

关于::在c++builder中使用。
大家可以试试
TDateTime aaa;
aaa=TDateTime::CurrentDateTime();

加载更多回复(23)

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧