如何在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;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
学习一下泛型
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!