Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;转换派生类_C++ - Fatal编程技术网

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

我对下面的代码(c++)有问题。我试着解释我需要什么。我有一个基类模板和两个方法不同的继承类。对于每个继承的类,我需要创建在另一个类中转换该类的构造函数/方法。指出了错误

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;