2013-09-30 2 views
0

I имеет следующую структуру, так что я могу назвать те же функции на элементах vector<Obj<T>*>, которые содержат некоторые Obj1, Obj2, Obj3 или Obj4.Наследование проблемы с определением указателя

Obj3 и Obj4 определены другими объектами (1 & 2), и им необходимо вызвать эти функции на const Obj1 или const Obj2.

Вопрос находится в Obj666, pObj, похоже, не указывает на o1_unit. Я бы объявил и определл static Obj1<double> = o1_unit(Obj1<double>(1.0)) и передал этот указатель на него в Obj3, но я не могу из-за шаблонов.

Этот метод хороший? Любой другой способ достичь этого?

template <typename T> 
class Obj 
{ 
    public: 
    T a; 

    public: 
    Obj(T a_ = 0) : a(a_) {} 

    virtual void fun() const = 0; 

}; 

template <typename T> 
class Obj1 : public Obj<T> 
{ 
    public: 
    T a1; 

    public: 
    // Obj1(T a1) : Obj<T>(a1) {} EDIT 
    Obj1(T a1_) : Obj<T>(a1_), a1(a1_) {} 
    void fun() const 
    { std::cout << a1 << std::endl;} 
}; 

template <typename T> 
class Obj2 : public Obj<T> 
{ 
    public: 
    T a2; 

    public: 
// Obj2(T a2) : Obj<T>(a2) {} EDIT 
Obj2(T a2_) : Obj<T>(a2_), a2(a2_) {} 

    void fun() const 
    { std::cout << a2 << std::endl;} 
}; 

template <typename T> 
class Obj666 : public Obj<T> 
{ 
    public: 
    Obj<T> *pObj; // need pointers because Obj3 uses an Obj1 but other subclasses could use Obj2 ... 
    T a666; 

    public: 
    Obj666(Obj<T>* pO) : Obj<T>(0), pObj(pO) {} 
    Obj666(Obj<T>* pO, T a666_) : Obj<T>(0), pObj(pO), a666(a666_) {} 

    virtual void fun() const 
    { pObj->fun(); 
     std::cout << a666 << std::endl; 
    } 

}; 

template <typename T> 
class Obj3 : public Obj666<T> 
{ 
    public: 
    Obj3() : Obj666<T>(&o1_unit), o1_unit(Obj1<T>(1.0)) {} 
    Obj3(T a666_) : Obj666<T>(&o1_unit, a666_), o1_unit(Obj1<T>(1.0)) {} 

    void fun() const 
    { (this->pObj)->fun(); 
     std::cout << "and something else from Obj3" << std::endl; 
    } 

    public: 
     Obj1<T> o1_unit; // Obviously, I would do without it, but I can't declare a static Obj1<T> o1_unit = Obj1<T>(1.0), because template.. 
}; 

template <typename T> 
class Obj4 : public Obj666<T> 
{ 
    public: 
    Obj4() : Obj666<T>(&o2_unit), o2_unit(Obj2<T>(10.0)) {} 
    Obj4(T a666_) : Obj666<T>(&o2_unit, a666_), o2_unit(Obj2<T>(10.0)) {} 

    void fun() const 
    { (this->pObj)->fun(); 
     std::cout << "and something else from Obj4" << std::endl; 
    } 

    public: 
     Obj2<T> o2_unit; // Obviously, I would do without it, but I can't declare a static Obj1<T> o1_unit = Obj1<T>(1.0), because template.. 

}; 

/// main.cpp 
Obj3<double> o3(5); 
Obj4<double> o4(13); 

std::vector<Obj<T>*> objs; 

objs.push_back(&o3); 
objs.push_back(&o4); 

objs[0]->fun(); // I'd like to call o1_unit->fun() so result 1 and 10 
objs[1]->fun(); // but I have random numbers (2.0887e-317, 6.95324e-310 ..) 
       // Same if I remove Obj3->fun, it calls Obj666->fun, but still no "1" 
+0

Вы не показываете настоящий код. 'std :: vector *> objs;' in 'main()' не будет компилироваться. – Angew

+1

'a1' и' a2' никогда не инициализируются, это причина случайных чисел, которые вы видите. Неясно, какая у вас проблема из-за шаблонов. Можете ли вы показать статическое определение, которое вы пытались использовать? –

+0

Obj1, Obj2, Obj3, Obj4, Obj666 - ** Что это значит **? Чего вы пытаетесь достичь? Похоже, это можно сделать в <20% от кода – sehe

ответ

0

Конструктор Obj1 не инициализирует a1 ни к чему. DTTO для Obj2 и a2.

+0

С правым, внесенные изменения и он работает. Позор, потому что у моего реального кода есть seg-сбои, и я надеялся, что причиной этого станет код. – user2287453

Смежные вопросы