C++转换派生类

C++ conversion derived classes

本文关键字:派生 转换 C++      更新时间:2023-10-16

我对下面的代码(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();
}
};

我必须做什么?感谢您的帮助!

要修复"不命名类型"错误,请尝试向前声明您的类(即,将以下行放在文件的顶部)。

template < typename T > class A;
template < typename T > class B;
template < typename T > class C;

然后将 this: B(const C &c)更改为 this: B(const C<T> &c) ,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 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;

类之间有一些循环依赖关系。您至少需要提供一些类的前向声明。即便如此,由于方法声明顺序的原因,您也可能需要更改对指针的引用。