免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2806 | 回复: 4
打印 上一主题 下一主题

[C++] 成员类的初始化 GTKMM [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-25 05:46 |只看该作者 |倒序浏览
关于类的初始化, 我看了thinking in c++, 当时看的时候也不是很明白, 因为看的是英文版的, 没有找到中文版。

现在我在看gtkmm的时候, 我看的是 programming with gtkmm, 英文版的。 在看到Gtk::TreeView的例子时, 这个问题就开始困扰我了。

我把我的问题提炼一下:


class A : public Gtk::TreeStore
{
    public:
      A(){
            set_column_types(b);
            //set_column_types from Gtk::TreeStore

        };

        class B : Gtk::TreeModel::ColumnRecord
        {
            
        };
        
        B b;
};


现在:

A a;



这样不行吗?

原书中是通过静态函数实现的, 具体:

class A : public Gtk::TreeStore
{
        protected:
                A()
                {
                        set_column_types(b)
                };

        public:
                static Glib::RefPtr<A> create()
                {
                                return Glib::RefPtr<A>(new A);
                        }

                class B : Gtk::TreeModel::ColumnRecord
                {
                       
                };
               
                B b;
};

A a = A::create();



这二者有什么区别吗?

[ 本帖最后由 huwenhuo 于 2009-9-25 21:06 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-25 12:59 |只看该作者
代码最后一行错了吧,猜是:

Glib::RefPtr<A> a = A::create();

不允许直接new一个类,必须通过Glib::RefPtr来持有指针,可能是为了减少内存泄露风险吧

论坛徽章:
0
3 [报告]
发表于 2009-09-25 21:10 |只看该作者
谢谢drangon指正, 我已经把这个错误改回来了。

但你所回答的好象不是我问的

因为你所说的内存管理问题其实可以这样实现:

Glib:RefPtr<A>* A = Gtk::Manage(New A);


声名一下,   我是新手, 不一定对的。 请教高手。

论坛徽章:
0
4 [报告]
发表于 2009-09-25 21:27 |只看该作者
原帖由 huwenhuo 于 2009-9-25 21:10 发表
谢谢drangon指正, 我已经把这个错误改回来了。

但你所回答的好象不是我问的

因为你所说的内存管理问题其实可以这样实现:

Glib:RefPtr* A = Gtk::Manage(New A);

声名一下,   我是新手, 不一定 ...


但这种写法别人不遵守约定还是可以直接写 A * a  = new A;

但通过将构造函数protected化,然后提供静态函数,能够强制必须通过RefPtr<>模板访问,无法直接 new A。

论坛徽章:
0
5 [报告]
发表于 2009-09-25 21:39 |只看该作者
懂了, 懂了, 我原来以为是A中定义了类B, 然后实例化B b, 这样的设计和b的实例化有关。 因为书中有一段解释, 让人感觉是这样的。


我把书中一段解释再附上:

class A : public Gtk::TreeStore
{
    protected:
        A()
        {
            //We can’t just call Gtk::TreeStore(b) in the initializer list

            //because b does not exist when the base class constructor runs.

            //And we can’t have a static b instance, because that would be

            //instantiated before the gtkmm type system.

            //So, we use this method, which should only be used just after creation:

            set_column_types(b)
        }
};

public:
static Glib::RefPtr<A> create()
    {
    return Glib::RefPtr<A>(new A);
    }

class B : Gtk::TreeModel::ColumnRecord
{

};

B b;
};

A a = A::create();


[ 本帖最后由 huwenhuo 于 2009-9-25 21:42 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP