C++ C++;转换派生类
我对下面的代码(c++)有问题。我试着解释我需要什么。我有一个基类模板和两个方法不同的继承类。对于每个继承的类,我需要创建在另一个类中转换该类的构造函数/方法。指出了错误C++ C++;转换派生类,c++,C++,我对下面的代码(c++)有问题。我试着解释我需要什么。我有一个基类模板和两个方法不同的继承类。对于每个继承的类,我需要创建在另一个类中转换该类的构造函数/方法。指出了错误 template < typename T > class A{ protected: T **m; void allocate_mem(T ***ptr){ *ptr = new T*[1]; (*ptr)[0] = new T[1]; } publi
template < typename T > class A{
protected:
T **m;
void allocate_mem(T ***ptr){
*ptr = new T*[1];
(*ptr)[0] = new T[1];
}
public:
A(){
throw logic_error("Error!");
}
void renew(T val){
m[0][0] = val;
}
~A(){
delete[] m[0];
delete[] m;
}
T say_elem(){
return m[0][0];
}
};
template < typename T > class B: public A< T >{
public:
B(int val){
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = val;
}
B(const C &c){ //'C' does not name a type
//ISO C++ forbids declaration of 'c' with no type [-fpermissive]
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = A<T>::c.say_elem();
}
};
template < typename T > class C: public A< T >{
public:
C(double val){
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = 1;
}
C(const B &b){ //'B' does not name a type
//ISO C++ forbids declaration of 'b' with no type [-fpermissive]
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = A<T>::b.say_elem();
}
};
模板A类{
受保护的:
T**m;
无效分配成员(T***ptr){
*ptr=新的T*[1];
(*ptr)[0]=新的T[1];
}
公众:
(){
抛出逻辑错误(“错误!”);
}
无效更新(T val){
m[0][0]=val;
}
~A(){
删除[]m[0];
删除[]m;
}
我不会说{
返回m[0][0];
}
};
模板B类:公共A{
公众:
B(国际价值){
A::分配_mem(&this->m);
A::m[0][0]=val;
}
B(const C&C){/'C'没有命名类型
/ISO C++禁止声明“c”,没有类型[fime]。
A::分配_mem(&this->m);
A::m[0][0]=A::c.say_elem();
}
};
模板C类:公共A{
公众:
C(双val){
A::分配_mem(&this->m);
A::m[0][0]=1;
}
C(常量B&B){/'B'没有命名类型
/ISO/C++禁止声明“B”,没有类型[ -许可]
A::分配_mem(&this->m);
A::m[0][0]=A::b.say_elem();
}
};
我该怎么办?谢谢你的帮助 类之间存在一些循环依赖关系。至少需要提供一些类的前向声明。即使这样,由于方法声明顺序的原因,您也可能需要更改对指针的引用。要修复“不命名类型”错误,请尝试声明您的类(即,将以下几行放在文件顶部)
转发声明的答案几乎正确,但转发声明不能指定父类。转发如下声明:
template < typename T > class A;
template < typename T > class B;
template < typename T > class C;
模板A类;
模板B类;
模板C类;
请避免使用指针-真的!我需要他们,他们是必要的!每当你在C++中使用*字符时,一只小猫就会爆炸……他有三颗星星!使用std::vector
。见预期'{'before';'Token将第二行放在类A的实现下面。我已经做了一个修复,并在我的编译器中检查了它。在这个论坛中有什么方法可以让我提高你的声誉吗?我是新来的…你可以通过点击答案左边的一个箭头来对答案的有用性进行投票。好的,但我需要声誉15来做到这一点(我是新来的,只有一个)…我会的!
template < typename T > class A {
protected:
T **m;
void allocate_mem(T ***ptr){
*ptr = new T*[1];
(*ptr)[0] = new T[1];
}
public:
A() { throw logic_error("Error!"); }
void renew(T val) { m[0][0] = val; }
~A() {
delete[] m[0];
delete[] m;
}
T say_elem() { return m[0][0]; }
};
template < typename T > class C;
template < typename T > class B: public A< T >{
public:
B(int val) {
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = val;
}
B(const C<T> &c) {
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = A<T>::c.say_elem();
}
};
template < typename T > class C: public A< T >{
public:
C(double val) {
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = 1;
}
C(const B<T> &b) {
A<T>::allocate_mem(& this->m);
A<T>::m[0][0] = A<T>::b.say_elem();
}
};
template < typename T > class A;
template < typename T > class B;
template < typename T > class C;