加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用没有名字的c类?

发布时间:2020-12-16 10:04:41 所属栏目:百科 来源:网络整理
导读:我在opensource c代码中遇到了问题.以下是描述我的问题的小型简化版本: #include iostreamusing namespace std;#define TOGETHER2(a,b) a ## b#define TOGETHER(a,b) TOGETHER2(a,b)#define GENERATE_NAME(a) TOGETHER(a,__COUNTER__)#define GENERATE GENE
我在opensource c代码中遇到了问题.以下是描述我的问题的小型简化版本:

#include <iostream>
using namespace std;
#define TOGETHER2(a,b) a ## b
#define TOGETHER(a,b) TOGETHER2(a,b)
#define GENERATE_NAME(a) TOGETHER(a,__COUNTER__)
#define GENERATE     GENERATE_NAME(__seed_)
class base{
}b;

class GENERATE:public base{
}GENERATE;

class GENERATE:public base{
}GENERATE;

class GENERATE:public base{
}GENERATE;

class GENERATE:public base{
}GENERATE;

int main(){
    return 0;
}

我们可以看到,作者定义了几个继承基类的类.但作者并不关心课程的名称.所以我想知道如何在不指定名称的情况下使用这些类?

这是c中我不知道的一种设计模式吗?

谢谢 :)

我想加上我的猜测,使问题清楚.

我的猜测:

这些类的名称是从__seed_生成的,但是当我搜索文件时,我找不到对__seed_的其他引用,所以我确信作者没有使用名称__seed_1,__ seed_2来创建类. (实际上作者说评论她并不关心课程的名称)

我还猜测作者可能已经通过基类(虚函数)中定义的接口使用了这些类.为此,作者仍然需要创建这些类,但正如我所提到的,我在代码的其他部分找不到__seed_,因此作者无法创建类,因此虚函数也不起作用.

实际上,我尝试删除这些类定义,奇怪的是代码编译正确.然而,它失去了一些功能,但它不仅仅是核心转储.它仍然可以成功地完成一些任务

那么,有谁知道:

>我们如何在不指定名称的情况下使用这些类?
>这种设计是某种设计模式吗?
>在哪种情况下我们应该定义课程而不关心他们的名字?
>正如我所提到的,我删除了部分代码,并编译.怎么会发生这种情况?我的意思是,因为我从源代码中删除了许多类,所以如果代码的其他部分引用这些类,则源无法编译.如果它编译,我可以断定不需要那些类吗?

添加:
正如你们有些人推荐的那样
完整的源代码在这里:MIT Cryptdb.在文件./main/rewrite_const.cc中,作者使用宏ANON(狮子25)来定义许多类而不关心他们的名字.

真的很感谢你的帮助:)

解决方法

我建议您编辑代码并添加类的名称.这是一个奇怪的设计模式,我建议你不要使用这种模式,除非你想阻止其他人使用你的类.

如果作者希望您使用这些类,可能有一些方法可以在不编辑代码和添加名称的情况下使用它们.您应该参考文档.

As I mentioned,I removed some part of the code,and It compiled. How could this happen? I mean,Since I remove many classes from the source code,then If other parts of the code references those classes,the source can not compile. And If it compiles,Can I just conclude that those classes are not needed?

所有这些生成的类都是从基类派生的.因此,如果删除一个类,则它之后的所有类都会收到一个新生成的名称.如果代码现在编译,则意味着其他代码仅调用属于基类的方法.但是其他代码现在使用的是其他类,而不是它最初使用的类,这会导致您观察到的错误.

考虑一下:

>最初生成的类具有名称A,B和C.>你删除A类.>现在生成的类具有名称A和B.名为C的类不再存在,因此使用它的代码不应再编译.而之前使用过A类和B类的代码,现在使用的是以前的B和C类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读