关于c++中不能被继承类的实现

93 views
Skip to first unread message

Baesky

unread,
Feb 22, 2012, 10:25:03 PM2/22/12
to TopLanguage
template <typename T>
class FinalClass
{
friend T;
private:
FinalClass();
~FinalClass();
};

class anyOne : public FinalClass<anyOne>
{
...
};

我在网上找的资料普遍就是友元的做法,这是我根据网上的做法利用模板机制做的一个类似java中final语义的类,不知道有什么更好的方法么?

rockeet febird

unread,
Feb 22, 2012, 10:29:03 PM2/22/12
to TopLanguage
需要 virtual inheritance

Shuo Chen

unread,
Feb 22, 2012, 10:57:00 PM2/22/12
to TopLanguage
更好的办法是写一行注释:
// You are not allow to derive from this class !!!

On Feb 23, 11:25 am, Baesky <baesky2...@gmail.com> wrote:

Ryan Feng

unread,
Feb 22, 2012, 10:59:58 PM2/22/12
to pon...@googlegroups.com
That's it!

On Wed, Feb 22, 2012 at 07:57:00PM -0800, Shuo Chen wrote:
> User-Agent: G2/1.0
> Date: Wed, 22 Feb 2012 19:57:00 -0800 (PST)
> To: TopLanguage <pon...@googlegroups.com>
> From: Shuo Chen <gian...@gmail.com>
> Subject: [TL] Re: 关于c++中不能被继承类的实现

--

Ryan Feng

unread,
Feb 22, 2012, 11:07:14 PM2/22/12
to pon...@googlegroups.com
That's it!

On Wed, Feb 22, 2012 at 07:57:00PM -0800, Shuo Chen wrote:
> User-Agent: G2/1.0
> Date: Wed, 22 Feb 2012 19:57:00 -0800 (PST)
> To: TopLanguage <pon...@googlegroups.com>
> From: Shuo Chen <gian...@gmail.com>
> Subject: [TL] Re: 关于c++中不能被继承类的实现
>

--

Li Ferdinand

unread,
Feb 22, 2012, 11:47:12 PM2/22/12
to pon...@googlegroups.com
你可太幽默了,呵呵。

jinhu wang

unread,
Feb 23, 2012, 12:00:21 AM2/23/12
to pon...@googlegroups.com
这跟幽默有啥关系,我觉得可以讨论一下,c++里面那些多余的语法及关键字。

rockeet febird

unread,
Feb 23, 2012, 12:11:38 AM2/23/12
to TopLanguage
人类基因里面的大部分序列都是冗余的。
经过了这么长时间的演化,冗余是不可避免的,并且很多貌似的确冗余的东西,看似没啥用处,而且还有害处,但总有人能发掘出它的好来。


On Feb 23, 1:00 pm, jinhu wang <wangjinhu...@gmail.com> wrote:
> 这跟幽默有啥关系,我觉得可以讨论一下,c++里面那些多余的语法及关键字。
>

> 在 2012年2月23日 下午12:47,Li Ferdinand <baesky2...@gmail.com>写道:
>
>
>
>
>
>
>
> > 你可太幽默了,呵呵。
>

WindyWinter

unread,
Feb 23, 2012, 12:16:50 AM2/23/12
to pon...@googlegroups.com
基因组里的冗余是进化过程中攒下来的,就像英国经过几百年的议会政治后会攒下很多莫名其妙的法案和习惯一样。它们只是“没有必要被去掉”,不能说它们“有必要存在”。

Soli Deo gloria.

WindyWinter
Email: wi...@ream.at
梦.:如此短暂: http://d.ream.at


2012/2/23 rockeet febird <roc...@gmail.com>

jinhu wang

unread,
Feb 23, 2012, 12:25:48 AM2/23/12
to pon...@googlegroups.com
完了!out了。好好学学基因学再来学c++:)

K.L.

unread,
Feb 23, 2012, 12:35:23 AM2/23/12
to TopLanguage
这个不能work啊,
class test : public anyOne {};
编译可以通过。

Li Ferdinand

unread,
Feb 23, 2012, 12:48:58 AM2/23/12
to pon...@googlegroups.com
模板要有调用才会实例化,你可以放到一个main里测试下,另外最好给finalclass加上virtual

mian()
{
   test workingOrnot;

rockeet febird

unread,
Feb 23, 2012, 3:56:15 AM2/23/12
to TopLanguage
他这个代码不对,我前面回复了,需要 virtual inheritance
正确代码应该是:
// 省略前面的 FinalClass 定义
class anyOne : public virtual FinalClass<anyOne>
{
...

};

Marmot

unread,
Feb 23, 2012, 5:56:21 AM2/23/12
to TopLanguage
请问为什么一定要加 virtual 才可以?

Li Ferdinand

unread,
Feb 23, 2012, 6:48:37 AM2/23/12
to pon...@googlegroups.com
我在vs2005下,不加vitual也可以。

rockeet febird

unread,
Feb 23, 2012, 8:09:56 AM2/23/12
to TopLanguage
C++ 标准规定:virtual base class 的构造函数是被 most derived class 直接(显式或隐式)调用的。如果有
多个 virtual base 这些 virtual base 的相对构造顺序是沿继承体系从上到下,从左到右。

rockeet febird

unread,
Feb 23, 2012, 8:18:26 AM2/23/12
to TopLanguage
如果不加 virtual 仍然编译错误的话,只能说 vs2005 太弱了,C++ 这个 feature 早在引入 virtual
inheritance 时(肯定早于1995年)就定义了!

On 2月23日, 下午7时48分, Li Ferdinand <baesky2...@gmail.com> wrote:
> 我在vs2005下,不加vitual也可以。
>

Marmot

unread,
Feb 24, 2012, 3:08:11 AM2/24/12
to TopLanguage
看到这个议题,我回去也写了一个简单的类,代码如下:

namespace FinalClass
{
template< class T >
class FinalClass
{
private:
friend T;
FinalClass(){};
~FinalClass(){};
};
};

一共就那么几行代码,可是越看越别扭.
1. 必须告诉 子类,你需要 virtual 继承.除了注释,没有任何办法告诉使用者加上virtual......
2. 这个类的析构函数需要加 virtual 么?如果加上virtual, 那么假设子类没有virtual函数,是不是增加了子类的无谓的负担?
但是没加 virtual,又没有任何办法阻止类似 FinalClass* 这种指针的声明.............

本意是要防止继承,但是写了这么简单的几行代码又引发出来了两个额外的问题. 到底值不值得那么写呢. 所以,最好的做法就是如 Shuo
chen 所说, // You are not allow to derive from this class !!!

Xpol Wan

unread,
Feb 24, 2012, 3:33:26 AM2/24/12
to pon...@googlegroups.com
同意啊。
如果是在文档里面,可以是红字。:)



Best Regards!

Xpol Wan
_G['China']['Human']['Male']['Software']['Programmer']['Embedded']['Gaming']['C/C++/Lua']



2012/2/24 Marmot <realw...@gmail.com>

Li Ferdinand

unread,
Feb 24, 2012, 7:06:37 AM2/24/12
to pon...@googlegroups.com
1.可以用宏
2.设计是需要选择的,很多设计不可能效率与速度兼得.而且加上注释,只是一种建议,完全没办法硬性规定对方不能使用.否则对方就可以对代码进行破坏.
很多代码,都是有上下文的,这种trick,没有亲身体会可能很难理解,这也是为什么就算把C++书翻的再熟,不实际运用也无法掌握好C++.实际工作不是面试,会背一些C++角落里的奇巧淫技就可以.而且,通常在实际工作中,很多好的设计,都因为很多原因,会扭曲.

Xiang Wang

unread,
Feb 24, 2012, 9:27:54 AM2/24/12
to pon...@googlegroups.com
其实我想说,

如果基类的构造函数是私有的,不久实现了?

2012/2/24 Li Ferdinand <baesk...@gmail.com>

K.L.

unread,
Feb 25, 2012, 8:39:35 AM2/25/12
to pon...@googlegroups.com
Java里的final class是不是防止包内的代码被包装后再次发布?我想不出什么设计上的动机来阻止类被继承。如果是为了版权限制,不管怎么做在C++中都没意义,C++的代码太容易被hack了。

在 2012年2月24日星期五UTC+8下午4时08分11秒,Marmot写道:
在 2012年2月24日星期五UTC+8下午4时08分11秒,Marmot写道:

Shuo Chen

unread,
Feb 25, 2012, 9:35:11 AM2/25/12
to TopLanguage
那这个基类怎么构造对象呢?

On Feb 24, 10:27 pm, Xiang Wang <xiang_w...@trendmicro.com.cn> wrote:
> *其实我想说,*
> *
> *
> *如果基类的构造函数是私有的,不久实现了?
> *
> 2012/2/24 Li Ferdinand <baesky2...@gmail.com>

co

unread,
Feb 25, 2012, 10:03:58 PM2/25/12
to pon...@googlegroups.com
C++ offers no derivation-prevention mechanism akin to Java's final classes or C#'s sealed classes。STL container types 都没有virtual 的destructor,如果继承了,后面又用一个基类指针delete子类对象,就会产生错误。所以,如果一个类没有virtual的destructor,还是不要继承的好。

Shuo Chen

unread,
Feb 25, 2012, 10:16:27 PM2/25/12
to TopLanguage
前面都对,最后那句话错了。"如果一个类没有virtual的destructor, 还是不要继承的好。"
应该是"如果一个类没有被设计为基类,还是不要继承的好。"

On Feb 26, 11:03 am, co <cui...@gmail.com> wrote:
> C++ offers no derivation-prevention mechanism akin to Java's final classes
> or C#'s sealed classes。STL container types 都没有virtual
> 的destructor,如果继承了,后面又用一个基类指针delete子类对象,就会产生错误。所以,如果一个类没有virtual的destructor, 还是不要继承的好。
>

> 在 2012年2月25日 下午9:39,K.L. <xxxK.L....@gmail.com>写道:
>
>
>
>
>
>
>
> > Java里的final
> > class是不是防止包内的代码被包装后再次发布?我想不出什么设计上的动机来阻止类被继承。如果是为了版权限制,不管怎么做在C++中都没意义,C++的代码 太容易被hack了。
>
> > 在 2012年2月24日星期五UTC+8下午4时08分11秒,Marmot写道:
>
> >> 看到这个议题,我回去也写了一个简单的类,代码如下:
>
> >> namespace FinalClass
> >> {
> >> template< class T >
> >> class FinalClass
> >> {
> >> private:
> >> friend T;

> >> FinalClass(){}**;
> >> ~FinalClass(){};
> >> };
> >> };
>
> >> 一共就那么几行代码,可是越看越别扭.
> >> 1. 必须告诉 子类,你需要 virtual 继承.除了注释,没有任何办法告诉使用者加上virtual..**....
> >> 2. 这个类的析构函数需要加 virtual 么?如果加上virtual, 那么假设子类没有virtual函数,**是不是增加了子类的无谓的负担?
> >> 但是没加 virtual,又没有任何办法阻止类似 FinalClass* 这种指针的声明.............
>
> >> 本意是要防止继承,**但是写了这么简单的几行代码又引发出来了两个额外的问题. 到底值不值得那么写呢. 所以,最好的做法就是如 Shuo


> >> chen 所说, // You are not allow to derive from this class !!!
>
> > 在 2012年2月24日星期五UTC+8下午4时08分11秒,Marmot写道:
>
> >> 看到这个议题,我回去也写了一个简单的类,代码如下:
>
> >> namespace FinalClass
> >> {
> >> template< class T >
> >> class FinalClass
> >> {
> >> private:
> >> friend T;

> >> FinalClass(){}**;
> >> ~FinalClass(){};
> >> };
> >> };
>
> >> 一共就那么几行代码,可是越看越别扭.
> >> 1. 必须告诉 子类,你需要 virtual 继承.除了注释,没有任何办法告诉使用者加上virtual..**....
> >> 2. 这个类的析构函数需要加 virtual 么?如果加上virtual, 那么假设子类没有virtual函数,**是不是增加了子类的无谓的负担?
> >> 但是没加 virtual,又没有任何办法阻止类似 FinalClass* 这种指针的声明.............
>
> >> 本意是要防止继承,**但是写了这么简单的几行代码又引发出来了两个额外的问题. 到底值不值得那么写呢. 所以,最好的做法就是如 Shuo

xpolife

unread,
Feb 25, 2012, 10:25:27 PM2/25/12
to pon...@googlegroups.com
以前公司产品代码里有一个gui类继承自std::vector……

xpol

Xiang Wang

unread,
Feb 25, 2012, 11:35:00 PM2/25/12
to pon...@googlegroups.com
#include <iostream>

using namespace std;

class A
{
public:
    static A* f()
    {
       return new A;
    }
private:
    A()
    {
       cout<<"construct"<<endl;
    }
    A( A& )
    {}
};
class B:public A
{
public:
      B(A & a):A(a)
       {
          cout<<"B constrcut"<<endl;
       }
};
int main()
{
      B b();
      return 0;
}

给个static接口调不就可以了。

2012/2/25 Shuo Chen <gian...@gmail.com>

Shuo Chen

unread,
Feb 26, 2012, 12:08:04 AM2/26/12
to TopLanguage
你这么做的话,class A 既不能用作stack object,也不能用作其他class的直接成员,
还不能用作标准容器的元素类型,每次用到A都必须动态分配内存,值得吗?

On Feb 26, 12:35 pm, Xiang Wang <xiang_w...@trendmicro.com.cn> wrote:
> *

> #include <iostream>
>
> using namespace std;
>
> class A
> {
> public:
> static A* f()
> {
> return new A;
> }
> private:
> A()
> {
> cout<<"construct"<<endl;
> }
> A( A& )
> {}};
>
> class B:public A
> {
> public:
> B(A & a):A(a)
> {
> cout<<"B constrcut"<<endl;
> }};
>
> int main()
> {
> B b();
> return 0;
>
> }
>
> 给个static接口调不就可以了。

> *
> 2012/2/25 Shuo Chen <giantc...@gmail.com>

Shuo Chen

unread,
Feb 26, 2012, 12:55:59 AM2/26/12
to TopLanguage
Java 的基础库都犯过类似错误,比如 Properties 继承自 Hashtable 。

On Feb 26, 11:25 am, xpolife <xpol...@gmail.com> wrote:
> 以前公司产品代码里有一个gui类继承自std::vector......
>
> xpol

Xiang Wang

unread,
Feb 26, 2012, 1:08:20 AM2/26/12
to pon...@googlegroups.com
没什么值得不值得的吧,就题目论题目而已。

2012/2/26 Shuo Chen <gian...@gmail.com>

Li Ferdinand

unread,
Feb 26, 2012, 2:21:48 AM2/26/12
to TopLanguage
其实你要说非得用友元么?当然不见得,达到一个目的的手段很多.
当我们脱离实际应用单纯去讨论一个技术或者一个trick时候,我觉得就显得很没有必要,因为一切技术都要被使用,被利用,才是有用的技术.一项技术单纯脱离上下文来讨论,那么只能是一千个人脑子里有一千个哈姆雷特了.

有的朋友说用注释,我为什么反对?因为注释这种东西,不能给人任何硬性规定.我想用语法机制上去强制客户无法使用这个继承,单纯用注释,我个人觉得是非常不妥的.举个例子,路边写个告示"禁制酒驾",你觉得有用么?总会有人对自己太有把握,觉得违背这个告示应该没什么,一切都在自我掌控之中.

友元的臭名昭著在网上几乎与goto并驾齐驱了,但是我在这里想为他们说句话:他们不是天生凶神恶煞,只是我们的滥用或者不合理使用,让他们背负了罪名.在某写特殊情况,他们并不是恶魔,使用他们并不代表着恶劣或者拙劣的设计.他们更像是c++语法世界的边缘,很多人在尝试走的时候掉了下去,而我们不能因此就放弃领略悬崖边的风景.

Ryan Feng

unread,
Feb 26, 2012, 3:35:50 AM2/26/12
to pon...@googlegroups.com
On Sun, Feb 26, 2012 at 03:21:48PM +0800, Li Ferdinand wrote:
> Date: Sun, 26 Feb 2012 15:21:48 +0800
> To: TopLanguage <pon...@googlegroups.com>
> From: Li Ferdinand <baesk...@gmail.com>
> Subject: Re: [TL] 关于c++中不能被继承类的实现

OT一下。这个例子让我想到了美国人开车,美国所有的岔路口, 都会有一个"STOP"的标志,
提示司机到此处要停车后观察其他路上没有距离比较近 的车行驶后再启动并拐弯,
而且我从没看到过哪个路口装有监控摄像头,但是所有的车都会在STOP标志前停一下,
并不只是减速,而是真的将车停下,观察其他车道过后再加速,一开始我很奇怪
路上的就一辆车,又是在乡村这种几公里内都看不到人的地方,为什么还要遵守这些小规矩.
后来才知道,在美国违反法律的结果是非常麻烦的,也听人说过无照驾驶与谋杀是同
一级的罪名。如果说酒后驾车又撞到人,可能人并没有什么大事,但是根据法律,
你就要付全责,受害人可以要求你支付所有的医疗费,美国的医疗费
是非常的高,通常是由保险公司帮你cover一大部分,个人很少有完全自己承担的,
如果惹上官司,那就更麻烦,受害人可以告你一辈子。

我想说的是,如果类作者注释里明确说明了不要直接继承此类,那就最好不要那么做,
如果你不遵守,那所有因此引起的后果都要你自己来承担。并不是只有写在语法里的才叫规矩,
程序员的注释也是代码的一部分,你就应该像遵守法律一样遵守它所说的。

--

Xiang Wang

unread,
Feb 26, 2012, 5:40:02 AM2/26/12
to pon...@googlegroups.com
一个小题目,你也有如此大论,怎么不去做叫兽?

2012/2/26 Ryan Feng <oday...@gmail.com>

Marmot

unread,
Feb 26, 2012, 6:16:03 AM2/26/12
to TopLanguage
一切这些都是围绕一个目的: 实现 类似 java Final 关键字的功能,最好实现的清晰,优雅,而且没有副作用.但是讨论来讨论去,没有发
现任何能像final关键字实现的那么清晰,优雅. 究其原因,引用 TCPL 上的一句话:
A language does not support a technique if it takes exceptional
effort or skill to write such pro-grams; it merely enables the
technique to be used.
这个特性并不是语言本身支持的,所有做出的努力仅仅是可以使用这个技术/特性.

这种努力有时候是有价值的,但是必然会带来一些副作用.但是想完全弄清楚所有的副作用又很难,毕竟C++提供那么多的特性,功能那么强大,甚至各种编译
器都不能提供统一的实现. 所以,我的结论是, 防止继承,简单的注释更加高效.

OxFAN

unread,
Feb 26, 2012, 3:41:36 PM2/26/12
to pon...@googlegroups.com
小题目你回答的很好么,问题没讨论多少,倒是先学会阴阳怪气的说话了

2012/2/26 Xiang Wang <xiang...@trendmicro.com.cn>

Xiang Wang

unread,
Feb 26, 2012, 9:05:13 PM2/26/12
to pon...@googlegroups.com
怎么,你回答的好?

我看这个thread就没你的comments.你有资格这么跟我说?

2012/2/27 OxFAN <oday...@gmail.com>

Ryan Feng

unread,
Feb 26, 2012, 9:20:05 PM2/26/12
to pon...@googlegroups.com
注意看邮箱地址

On Mon, Feb 27, 2012 at 10:05:13AM +0800, Xiang Wang wrote:
> Date: Mon, 27 Feb 2012 10:05:13 +0800
> To: pon...@googlegroups.com
> From: Xiang Wang <xiang...@trendmicro.com.cn>
> Subject: Re: [TL] 关于c++中不能被继承类的实现
>
> 怎么, 回答的好?
> 我看这个thread就没 的comments. 有资 这么跟我说?
> 2012/2/27 OxFAN <[1]oday...@gmail.com>
>
> 小题目 回答的很好么,问题没讨论多少,倒是
> 学会阴阳怪气的说话了
>
> 2012/2/26 Xiang Wang <[2]xiang...@trendmicro.com.cn>
>
> 一个小题目, 也有如此大论,怎么不去做叫 ?
> 2012/2/26 Ryan Feng <[3]oday...@gmail.com>


>
> On Sun, Feb 26, 2012 at 03:21:48PM +0800, Li Ferdinand wrote:
> > Date: Sun, 26 Feb 2012 15:21:48 +0800

> > To: TopLanguage <[4]pon...@googlegroups.com>
> > From: Li Ferdinand <[5]baesk...@gmail.com>
> > Subject: Re: [TL] 于c++中不能被继承类的实现
> >
> > 实 要说非得用友
> 么?当然不见得,达到一个目的的手段很多.
> > 当我们脱离实 应用单纯去讨论一个技术或
> 一个trick时候,我觉得就显得很没有 要,
> 为一切技术都要被使用,被利用,才是有用的技术.一项技术单纯脱离上下文来讨论,那么只能是一千个人脑子里有一千个哈姆雷特了.
> > 有的朋友说用注释,我为什么反对?
> 为注释这种东西,不能给人任何硬性规定.我想用语法机制上去强制客户
> 法使用这个继承,单纯用注释,我个人觉得是非常不妥的.举个例子,路边写个告示"禁制
> 驾",
> 觉得有用么?总会有人对自己太有把握,觉得违背这个告示应该没什么,一切都在自我掌控之中.
> > 友 的臭名昭著在网上
> 乎与goto并驾齐驱了,但是我在这里想为他们说句话:他们不是天生凶神恶
> ,只是我们的滥用或
> 不合理使用,让他们背负了罪名.在某写特殊
> 况,他们并不是恶魔,使用他们并不代表着恶劣或
> 拙劣的设计.他们更像是c++语法世界的边缘,很多人在尝试走的时候掉了下去,而我们不能
> 此就放弃领略悬崖边的风景.
>
> OT一下。这个例子让我想到了美国人开车,美国所有的岔路口,
> 都会有一个"STOP"的 志,
> 提示司机到此处要停车后观察
> 他路上没有距离比较近 的车行驶后再启动并拐弯,
> 而且我从没看到过哪个路口
> 有监控摄像头,但是所有的车都会在STOP
> 志前停一下,
> 并不只是减速,而是真的将车停下,观察
> 他车道过后再 速,一开始我很奇怪
> 路上的就一辆车,又是在乡村这种 里
> 都看不到人的地方,为什么还要遵守这些小规矩.
> 后来才知道,在美国违反法律的结果是非常麻烦的,也听人说过
> 驾驶与谋杀是同
> 一级的罪名。如果说
> 后驾车又撞到人,可能人并没有什么大事,但是
> 据法律,
> 就要付 责,受害人可以要求
> 支付所有的医疗费,美国的医疗费
> 是非常的高,通常是由保险 司帮
> cover一大部分,个人很少有完 自己承 的,
> 如果惹上官司,那就更麻烦,受害人可以告
> 一辈子。
>
> 我想说的是,如果类作
> 注释里明确说明了不要直接继承此类,那就最好不要那么做,
> 如果 不遵守,那所有 此引起的后果都要
> 自己来承 。并不是只有写在语法里的才叫规矩,
> 程序员的注释也是代 的一部分,
> 就应该像遵守法律一 遵守它所说的。
> --
>
> References
>
> Visible links
> 1. mailto:oday...@gmail.com
> 2. mailto:xiang...@trendmicro.com.cn
> 3. mailto:oday...@gmail.com
> 4. mailto:pon...@googlegroups.com
> 5. mailto:baesk...@gmail.com

--

Hook

unread,
Feb 28, 2012, 2:06:55 AM2/28/12
to pon...@googlegroups.com
请不要把外面论坛的风气带到这里来。耻于有你这种腔调的人存在这个组里。

2012/2/27 Xiang Wang <xiang...@trendmicro.com.cn>

achilleus liu

unread,
Feb 28, 2012, 4:37:32 AM2/28/12
to pon...@googlegroups.com
弱弱得问一句:
friend T 这一行代码你们怎么编译过的?
我用g++ 4.4 和 g++ 4.6 -std=c++0x 都编译不过

Li Ferdinand

unread,
Feb 28, 2012, 9:06:24 AM2/28/12
to pon...@googlegroups.com
vs2005 Professional版。

泉子

unread,
Feb 28, 2012, 9:19:30 PM2/28/12
to pon...@googlegroups.com
我昨天测试了一下,单纯就这个类来说,我觉得与noncopyable一样,还是能带来些便利的。但有个问题:在VS2008下,如果从受保护类非法派生的类不具有自定义构造函数,则这个保护会失效?我不知道是我测试方法不对还是编译特性,有兴趣的同学可以确认下。我的总结在此:
http://blog.yedaoq.info/?p=30002

Zhangming Niu

unread,
Feb 29, 2012, 4:14:35 AM2/29/12
to pon...@googlegroups.com
纯stl是用DISALLOW_COPYING(className);

2012/2/29 泉子 <yed...@gmail.com>

泉子

unread,
Feb 29, 2012, 8:41:42 AM2/29/12
to pon...@googlegroups.com
哎,看来我又见识短浅了...

yuan zhu

unread,
Mar 1, 2012, 3:20:38 AM3/1/12
to pon...@googlegroups.com
我也不行,friend class T也不行。包括间接的方法也不行。

On 2/28/12, achilleus liu <sanach...@gmail.com> wrote:
> 弱弱得问一句:
> friend T 这一行代码你们怎么编译过的?
> 我用g++ 4.4 和 g++ 4.6 -std=c++0x 都编译不过
>
> 在 2012年2月28日 下午3:06,Hook <hoo...@gmail.com>写道:
>
>> 请不要把外面论坛的风气带到这里来。耻于有你这种腔调的人存在这个组里。
>>
>>
>> 2012/2/27 Xiang Wang <xiang...@trendmicro.com.cn>
>>

>>> *怎么,你回答的好?*
>>> *
>>> *
>>> *我看这个thread就没你的comments.你有资格这么跟我说?
>>> *


>>>
>>> 2012/2/27 OxFAN <oday...@gmail.com>
>>>
>>>> 小题目你回答的很好么,问题没讨论多少,倒是先学会阴阳怪气的说话了
>>>>
>>>>
>>>> 2012/2/26 Xiang Wang <xiang...@trendmicro.com.cn>
>>>>

>>>>> *一个小题目,你也有如此大论,怎么不去做叫兽?
>>>>> *

Xinyu LIU

unread,
Mar 1, 2012, 5:33:12 AM3/1/12
to pon...@googlegroups.com
没有看到STL的源码中有DISALLOW_COPYING (grep了SGI STL)
boost中有noncopyable:
http://www.boost.org/doc/libs/1_49_0/boost/noncopyable.hpp

另外Google和Qt都有自己的宏:
http://stackoverflow.com/questions/1454407/macros-to-disallow-class-copy-and-assignment-google-vs-qt
--
Larry, LIU Xinyu
https://sites.google.com/site/algoxy/
https://github.com/liuxinyu95/AlgoXY

yuan zhu

unread,
Mar 2, 2012, 2:05:43 AM3/2/12
to pon...@googlegroups.com
还好,哥解决了,必须类自己处理
template <typename T>
struct stop_inherit
{
typedef T inner_type;
friend class stop_inherit<T>::inner_type; //很无语,但是必须得这样哟
private:
stop_inherit(){}
};

Zhangming Niu

unread,
Mar 2, 2012, 5:17:31 AM3/2/12
to pon...@googlegroups.com
主要有2种方法么~
一种是disallow_copying( class name )
另一种是声明那个function是private,然后里边参数都是const.保险起见你得把参数也声明成const

2012/3/2 yuan zhu <zy49...@gmail.com>

Zhangming Niu

unread,
Mar 2, 2012, 5:17:55 AM3/2/12
to pon...@googlegroups.com
function ->method

2012/3/2 Zhangming Niu <niuzha...@gmail.com>

eRay Jiang

unread,
Mar 2, 2012, 11:47:10 AM3/2/12
to pon...@googlegroups.com
顶起!

在 2012年2月23日星期四UTC+8上午11时57分00秒,Shuo Chen写道:
更好的办法是写一行注释:

// You are not allow to derive from this class !!!

achilleus liu

unread,
Mar 4, 2012, 8:30:21 PM3/4/12
to pon...@googlegroups.com
template <typename T>
struct stop_inherit
{
       typedef T inner_type;
       friend class stop_inherit<T>::inner_type; //很无语,但是必须得这样哟
private:
       stop_inherit(){}
}; 
这个方法还是没编译过:
error: using template type parameter ‘T’ after ‘class’
error: friend declaration does not name a class or function
gcc version 4.6.1,   编译命令 g++ -std=c++0x

yuan zhu

unread,
Mar 5, 2012, 3:16:14 AM3/5/12
to pon...@googlegroups.com
4.6好像真不行。但是这里可以http://codepad.org
Reply all
Reply to author
Forward
0 new messages