如何在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后,通过宏的递归来产生后续的类,而不是手动一个循环把代码先打出来再复制上去

用模板递归
求采纳

#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;
}

这个用宏递归实现不了吧,你应该用函数进行递归来实现你的算法, 而不是定义这么多派生的类
用宏实现的只能这样,但是不好递归

#include <iostream>
using namespace std;

#define DP(N,M) class a##N : public a##M\
{\
public:\
    a##N(int n) : a##M(n) {}\
    friend ostream &operator<<(ostream &os, a##N &A)\
    {\
        os << (a##M &)A;\
        return os;\
    }\
};


class a0
{
    int num;

public:
    a0(int n) : num(n) {}
    friend ostream &operator<<(ostream &os, a0 &A)
    {
        os << A.num;
        return os;
    }
};

DP(1,0)
DP(2,1)
DP(3,2)

int main()
{
    a3 p(124);
    cout << p << endl;
    return 0;
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

学习一下泛型

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632