工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
楼主: hjack

类型转换问题

[复制链接]
 楼主| 发表于 2008-5-15 22:46 | 显示全部楼层
回到开头的问题,
用base指针放在queue里,想dequeue后按derive来处理,不用dynamic_cast的话,还有什么方法吗/
回复

使用道具 举报

发表于 2008-5-15 23:18 | 显示全部楼层
这个不是多态的问题吗?用virtual 成员函数不行?

QQB的代码有问题?

[ 本帖最后由 onttpi 于 2008-5-15 23:33 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-5-16 11:08 | 显示全部楼层
The code in QQB is right.
Shared_ptr is good. Take it. Thanks.
It works now.
回复

使用道具 举报

 楼主| 发表于 2008-5-16 11:19 | 显示全部楼层
One question,
A is base class, B is derive class.

   typedef boost::shared_ptr<A> eT;
   typedef queue<eT> qT;
   qT q;
   q.push(eT(new B));
Can it work? What if:
B *b = new B;
q.push(eT(b));
will memory leak occur?
回复

使用道具 举报

发表于 2008-5-16 12:09 | 显示全部楼层
如果它是照我上网查到的资料所说的按引用数来决定是否自动清理(类似于java的回收算法策略)
LS代码应该没问题吧,just have a try..
回复

使用道具 举报

发表于 2008-5-16 13:21 | 显示全部楼层
#include "boost/shared_ptr.hpp"
#include <cassert>
#include <queue>
#include <iostream>
using boost::shared_ptr;

class A {
public:
  A(){}
  virtual void say(){
          std::cout<<"A saying.."<<std::endl;
  }
};

class B:public A{
public:
  B(){}
  virtual void say(){
          std::cout<<"B saying.."<<std::endl;
  }
};

int main() {
        typedef boost::shared_ptr<A> eT;
        typedef queue<eT> qT;
           qT q;
           q.push(eT(new B));
           eT tmp=q.front();
           (*tmp).say();
}
回复

使用道具 举报

发表于 2008-5-16 13:32 | 显示全部楼层
#include "boost/shared_ptr.hpp"
#include <cassert>
#include <queue>
#include <iostream>
using boost::shared_ptr;

class A {
public:
  A(){}
  virtual void say(){
          std::cout<<"A saying.."<<std::endl;
  }
  virtual ~A(){
          std::cout<<"A destructed.."<<std::endl;
  }
};

class B:public A{
public:
  B(){}
  virtual void say(){
          std::cout<<"B saying.."<<std::endl;
  }
  ~B(){
          std::cout<<"B destructed.."<<std::endl;
  }
};

int main() {
        typedef boost::shared_ptr<A> eT;
        typedef queue<eT> qT;
           qT q;
           q.push(eT(new B));
           /*
           eT tmp=q.front();//如果用tmp指向,pop不会造成释放,因为tmp还指向它
           tmp->say();
           */
           (q.front())->say();//这样用的话,pop后会被释放
           std::cout<<"Before pop"<<endl;
           q.pop();
           std::cout<<"After pop"<<endl;
}
回复

使用道具 举报

发表于 2008-5-16 13:41 | 显示全部楼层

More test.... It seems that mem leak would not happen..

#include "boost/shared_ptr.hpp"
#include <cassert>
#include <queue>
#include <iostream>
using boost::shared_ptr;

class A {
public:
  A(){}
  virtual void say(){
          std::cout<<"A saying.."<<std::endl;
  }
  virtual ~A(){
          std::cout<<"A destructed.."<<std::endl;
  }
};

class B:public A{
public:
  B(){}
  virtual void say(){
          std::cout<<"B saying.."<<std::endl;
  }
  ~B(){
          std::cout<<"B destructed.."<<std::endl;
  }
};

typedef boost::shared_ptr<A> eT;
typedef queue<eT> qT;
void test(qT& q){
        eT tmp=q.front();
           tmp->say();
           std::cout<<"Before pop"<<endl;
           q.pop();
           std::cout<<"After pop"<<endl;
}
int main() {
           qT q;
        q.push(eT(new B));
           std::cout<<"Before test.."<<std::endl;
        test(q);
        std::cout<<"After test.."<<std::endl;
           return 0;
}

output:
Befor test...
      B sayiing...
      Before pop...
      After pop..
      B destructed..
      A destructed...
After test
回复

使用道具 举报

发表于 2008-5-16 13:43 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2008-5-17 22:50 | 显示全部楼层
看起来是这样....
回复

使用道具 举报

 楼主| 发表于 2008-5-22 18:30 | 显示全部楼层
What happens if using below method:

A *a = static_cast<A*>(q.front().get()));

will the pointer out of control of shared_ptr?
回复

使用道具 举报

发表于 2008-5-26 19:04 | 显示全部楼层
多态必要用指针或者引用来实现
所以应该用Base *pb = q.front();
pb->...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-30 07:01

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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