C ++转换派生类

时间:2014-01-14 20:19:05

标签: 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 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();
}
};

我该怎么办?谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

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

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();
    }
};

答案 1 :(得分:1)

前向声明答案几乎是正确的,但前向声明不能指定父类。转发声明如下:

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

答案 2 :(得分:0)

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