繁体   English   中英

C ++转换派生类

[英]C++ conversion derived classes

我的代码有问题(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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM