游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4188|回复: 14

一个关于派生类函数的调用问题,请朋友们看看

[复制链接]

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
发表于 2006-8-16 16:12:00 | 显示全部楼层 |阅读模式
我有下面这段代码,现在我想要实现的功能就是能在屏幕上正常显示"TEST SOMETHING",但是objFirst不能定义成全局变量,更不能用new first来实现,即不能将objFirst定义成指针。
class base
{
    virtual void doSomeThing()=0;
};

class first:public base
{
        void doSomeThing(){cout<<"TEST SOMETHING"<<endl;}
};

class Manager
{
protected:
        first *m_lpObject;

public:
        void Add(base *pObject){//这里就是我想知道的,这段代码应该怎么写啊?}
        void Show(){m_lpObject->doSomeThing();}
};

Manager objTest;
void TestSomeThing()
{
        first objFirst;
        objTest.Add(&objFirst);
}

void main()
{
        TestSomeThing();
        objTest.Show();
        Sleep(10000);
}

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-8-16 16:58:00 | 显示全部楼层

Re:一个关于派生类函数的调用问题,请朋友们看看

如果不能new出来,就用static变量吧。
要不然到了main的show时,objFirst早已被销毁了,结果不可预料。

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
 楼主| 发表于 2006-8-16 17:57:00 | 显示全部楼层

Re:一个关于派生类函数的调用问题,请朋友们看看

可能我没有说明白,我的意思是不能在Manager以外new,而是只能在Manager的Add中new。现在我需要的一个功能就是在注释的地方有个类似于m_lpObject = new XX的代码。但是目前这个XX的具体类型是未知的,所能知道的仅仅是XX是base的一个派生类。简言之就是说能否在注释的地方判断出pObject的类型,然后再new一个就好了,不过这个比较难了,所以我希望达人们能指出一个可以模拟该功能的代码。

0

主题

172

帖子

176

积分

注册会员

Rank: 2

积分
176
发表于 2006-8-16 21:43:00 | 显示全部楼层

Re:一个关于派生类函数的调用问题,请朋友们看看

方案一,template
方案二,含一个有统一参数的构造函数,注册类函数,函数指针数组,按照注册名创建。

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2006-8-16 22:21:00 | 显示全部楼层

Re:一个关于派生类函数的调用问题,请朋友们看看

class base
{
public:
        virtual void doSomeThing()=0;
};

class first:public base
{
public:
        void doSomeThing(){cout<<"TEST SOMETHING"<<endl;}
};

class Manager
{
protected:
        base *m_lpObject;

public:
        void Add(base *pObject){m_lpObject = pObject;}
        void Show(){m_lpObject->doSomeThing();}
};

Manager objTest;
first objFirst;

void TestSomeThing()
{
        objTest.Add(&objFirst);
}

int _tmain(int argc, _TCHAR* argv[])
{
        TestSomeThing();
        objTest.Show();
       
        return 0;
}
我改了一下你的程序。其实可以在全局使用objFirst,也可以new first,在你需要的地方。你可以在你需要的时候new一个first(或者base的派生类),再把它添加到Manager里面。

50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
 楼主| 发表于 2006-8-17 01:50:00 | 显示全部楼层

Re:一个关于派生类函数的调用问题,请朋友们看看

唉,可能真的是我的表达力不行。这样说吧,base和Manager是在DLL中实现的,first只是用了DLL中base提供的接口。现在的情况是,first是绝对不能用全局变量来实现,因为first出现的次数会很多,而且是具有不定性(就是不确定有多少个),因此首先排除。而如果使用new first来实现的话,因为Manager是在DLL中,那么释放new出来的first就只能在new的局部过程里释放,即代码里的TestSomeThing()中释放。问题就在这里了,由于Manager是全局使用的,那么TestSomeThing()中new的first就不能在TestSomeThing()内就销毁了。所以我理想中的方法就是能在Manager的Add()中new就好了,不过目前我暂时无法实现这一步,所以希望会的高手们能给点建议。
4楼朋友的方法2使得程序更为复杂了点,当base的派生类比较多的情况下效率也是问题,并且使得接口更为复杂,违背了设计这个类的本意。但是方法一今天我试了半天也没想到一个好的实现,如果可以,可以描述下如何实现么?

103

主题

1432

帖子

1458

积分

金牌会员

Rank: 6Rank: 6

积分
1458
QQ
发表于 2006-8-17 03:12:00 | 显示全部楼层

Re:一个关于派生类函数的调用问题,请朋友们看看

我的理解是这样: 你的意思是通过基类指针传递对象,然后拷贝实际对象吧。

class base{   virtual base* newObj();  virtual void call() = 0;  }
class first : public base { base* newObje(){return new first(*this); }
void call(){cout << "hello gameres" << endl;}

  }

void test(base *b)
{       base *temp = b->newObj(b);
temp->call ();

}

103

主题

1432

帖子

1458

积分

金牌会员

Rank: 6Rank: 6

积分
1458
QQ
发表于 2006-8-17 03:26:00 | 显示全部楼层

Re:一个关于派生类函数的调用问题,请朋友们看看

//通过基类指针传递对象,然后拷贝实际对象
class baseB{
public:  
        virtual baseB* newObj()=0;  

        virtual void call() = 0;  
};

class firstB : public baseB
{
public:
        baseB* newObj(){
                return new firstB(*this);
        }
        void call(){cout << "hello gameres" << endl;}

  };
class firstA : public baseB
{
public:
        baseB* newObj(){
                return new firstA(*this);
        }
        void call(){cout << "hello htqx" << endl;}
};

inline void testB(baseB *b)
{      
        baseB *temp = b->newObj();
        temp->call ();

}

//测试
int main()
{
        //调用派生类
        firstB f;
        firstA f2;
        testB(&f);
        testB(&f2);

}

36

主题

382

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 2006-8-17 09:07:00 | 显示全部楼层

Re: 一个关于派生类函数的调用问题,请朋友们看看

显然着里有一个逻辑上的矛盾。

首先你的dll里面不知道新的类型,所以无法new.但你又偏要new.这不是强代码所难么?

所以要么你让dll知道那个类型,要么就只能做你不喜欢的事,在外面new.

无论是new好了传进来,还是搞ge注册的模式都应该算在外面new.



50

主题

244

帖子

319

积分

中级会员

Rank: 3Rank: 3

积分
319
QQ
 楼主| 发表于 2006-8-17 09:22:00 | 显示全部楼层

Re:一个关于派生类函数的调用问题,请朋友们看看

谢谢7楼的朋友啦,目前看来也只有重载构造函数或者单独写一个copy的函数才能实现了,其实当初我天真的想只要外面继承了基类,其他操作都不用管了,呵呵~!
9楼的朋友可能少看了个逻辑,dll其实知道基类的,就相当于知道了接口,因此从基类派生的任何类都可以用来new。而你所说的从外面new,那么你说说如何管理局部插入的实例呢?记住Manager是要全局使用的。

此帖结帖,谢谢楼上的朋友们。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 03:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表