太上道祖330 2022-08-12 22:55 采纳率: 100%
浏览 77
已结题

如何在C++用宏递归生成不断派生的类

问题遇到的现象和发生背景

如何在C++用宏递归生成不断派生的类
不要使用模板,这里本意就是要用宏!模板最多500层,继承至少可以1000层

问题相关代码,请勿粘贴截图

class a0 {
int num;
public:
a0(int n):num(n){}
friend ostream& operator<<(ostream& os, a0& A) {
os << A.num;
return os;
}
};
class a1 :public a0 {
public:
a1(int n) :a0(n) {}
friend ostream& operator<<(ostream& os, a1& A) {
os << (a0&)A;
return os;
}
};
class a2 :public a1 {
public:
a2(int n) :a1(n) {}
friend ostream& operator<<(ostream& os, a2& A) {
os << (a1&)A;
return os;
}
};
class a3 :public a2 {
public:
a3(int n) :a2(n) {}
friend ostream& operator<<(ostream& os, a3& A) {
os << (a2&)A;
return os;
}
};
class a4 :public a3 {
public:
a4(int n) :a3(n) {}
friend ostream& operator<<(ostream& os, a4& A) {
os << (a3&)A;
return os;
}
};
class a5 :public a4 {
public:
a5(int n) :a4(n) {}
friend ostream& operator<<(ostream& os, a5& A) {
os << (a4&)A;
return os;
}
};
class a6 :public a5 {
public:
a6(int n) :a5(n) {}
friend ostream& operator<<(ostream& os, a6& A) {
os << (a5&)A;
return os;
}
};
class a7 :public a6 {
public:
a7(int n) :a6(n) {}
friend ostream& operator<<(ostream& os, a7& A) {
os << (a6&)A;
return os;
}
};

class PRINT {
int n;
public:
PRINT(int m):n(m){}
friend ostream& operator<<(ostream& os, PRINT& P) {
for (int i = 1; i < P.n; i++) {
os << "class a" << i << " :public a" << i - 1 << " {\npublic:\n\ta" << i << "(int n)"<< ":a" << i - 1 << "(n){}" << endl;
os << "friend ostream& operator<<(ostream& os, a" << i << "& A){\n\t\t os << (a" << i - 1 << "&)A;\nreturn os;\n}\n};\n";
}
return os;
}
};

运行结果及报错内容

我的解答思路和尝试过的方法

我试图通过宏的递归来将a0之后的代码简洁的表示,但是具体的细节不知道怎么做,现在的代码是我先写了一个循环(也就是最后面部分的内容)把上面需要的代码打入记事本然后手动复制过来,缺点是代码量极大

我想要达到的结果

能在定义a0后,通过宏的递归来产生后续的类,而不是手动一个循环把代码先打出来再复制上去

  • 写回答

4条回答 默认 最新

  • [PE]经典八炮 2022-08-13 18:27
    关注

    用模板递归
    求采纳

    #include<iostream>
    using namespace std;
    template<typename T,unsigned int n>
    class A
    {
    private:
        A<T,n - 1> obj;
    public:
        A(const T& x) :obj(x) {}
        void Show()const
        {
            obj.Show();
        }
    };
    template<typename T>
    class A<T,0>
    {
    private:
        T i;
    public:
        A(const T&x) :i(x) {}
        void Show()const
        {
            cout << i;
        }
    };
    int main()
    {
        A<int,5> a(100);
        a.Show();
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月24日
  • 已采纳回答 8月22日
  • 修改了问题 8月13日
  • 修改了问题 8月12日
  • 展开全部

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制