Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2013, 13:43   #1
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию Наследование шаблонов

Доброго времени суток всем!
Помогите, пожалуйста, разобраться, что не так в следующем коде:

PHP код:
#include <vector>
#include <iostream>

using namespace std;

templatetypename P >
class 
{
public:
    
A() {;}
    
Pval;
};

templatetypename P >
class 
B: public AvectorA>* > > {
public:
    
B(): val(new vectorA>* >) {;} 
    
void add(A> *arg) { val->push_back(arg); }
    
void print() {
        for( 
unsigned int i 0val->size(); ++) {
            
cout << val[i]->val << endl;
        }
    }
};

int _tmain(int argc_TCHARargv[])
{
    
A<inta0a1;
    
a0.val = new int(1); 
    
a1.val = new int(2);
    
B<intb;
    
b.add(&a0);
    
b.add(&a1);
    
b.print();
    return 
0;

При попытке построить VS 2005 выдаёт сообщение об ошибке следующего сообщения:

test_templates.cpp(20) : error C2614: 'B<P>' : illegal member initialization: 'val' is not a base or member

Вроде бы в классе B параметр val - это указатель на вектор указателей на объекты класса A...

Заранее спасибо
Diablero вне форума Ответить с цитированием
Старый 17.09.2013, 15:25   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Шаблоны тут не при чем вообще.
Мог бы указать на какую строку ругается студия
rrrFer вне форума Ответить с цитированием
Старый 17.09.2013, 15:26   #3
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Инициализация членов базового класса происходит до вызова конструктора базового класса. Конструктор базового класса вызывается до инициализации членов производного класса. Это значит, что инициализация членов базового класса через список инициализации производного невозможна. Но можно просто присвоить им нужные значения в теле конструктора производного. Хотя с точки зрения инкапсуляции лучше определить конструктор в базовом классе и в списке инициализации производного вызывать его.
still_alive вне форума Ответить с цитированием
Старый 17.09.2013, 16:10   #4
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Инициализация членов базового класса происходит до вызова конструктора базового класса. Конструктор базового класса вызывается до инициализации членов производного класса. Это значит, что инициализация членов базового класса через список инициализации производного невозможна. Но можно просто присвоить им нужные значения в теле конструктора производного. Хотя с точки зрения инкапсуляции лучше определить конструктор в базовом классе и в списке инициализации производного вызывать его.
Спасибо!

Переписал так:
PHP код:
#include <vector>
#include <iostream>

using namespace std;

templatetypename P >
class 
{
public:
    
A(): val(new P) {;}
    
Pval;
};

templatetypename P >
class 
B: public AvectorA>* > > {
public:
    
B() {;} 
    
void add(A> *arg) { val->push_back(arg); }
    
void print() {                                     //LINE 22
        
for( unsigned int i 0val->size(); ++) {
            
cout << val[i]->val << endl//LINE 24
        
}
    }
};

int _tmain(int argc_TCHARargv[])
{
    
A<inta0a1;
    
a0.val = new int(1); 
    
a1.val = new int(2);
    
B<intb;    //LINE 34
    
b.add(&a0);
    
b.add(&a1);
    
b.print();
    return 
0;

Теперь студия выплюнула ошибку следующего содержания:

PHP код:
test_templates.cpp(24) : error C2039'val' is not a member of 'std::vector<_Ty>'
        
with
        
[
            
_Ty=A<int> *
        ]
        
test_templates.cpp(22) : while compiling class template member function 'void B<P>::print(void)'
        
with
        
[
            
P=int
        
]
        
test_templates.cpp(34) : see reference to class template instantiation 'B<P>' being compiled
        with
        
[
            
P=int
        

Diablero вне форума Ответить с цитированием
Старый 17.09.2013, 16:32   #5
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
cout << val[i]->val << endl; //LINE 24
Подумай о том, какой тип имеют
val
val[i]
*val[i]
still_alive вне форума Ответить с цитированием
Старый 17.09.2013, 16:49   #6
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Подумай о том, какой тип имеют
val
val[i]
*val[i]
Ага, ясно, спс

Для интересующихся привожу рабочий вариант

PHP код:
#include <vector>
#include <iostream>

using namespace std;

templatetypename P >
class 
{
public:
    
A(): val(new P) {;}
    
Pval;
};

templatetypename P >
class 
B: public AvectorA>* > > {
public:
    
B() {;} 
    
void add(A> *arg) { val->push_back(arg); }
    
void print() {
        for( 
unsigned int i 0val->size(); ++) {
            
cout << *((*val)[i]->val) << endl;
        }
    }
};

int _tmain(int argc_TCHARargv[])
{
    
A<inta0a1;
    
a0.val = new int(1); 
    
a1.val = new int(2);
    
B<intb;
    
b.add(&a0);
    
b.add(&a1);
    
b.print();
    
char c;
    
cin>>c;
    return 
0;

Diablero вне форума Ответить с цитированием
Старый 17.09.2013, 17:56   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Открой секрет, что это за говнокод? - чего ты им хочешь добиться?

тут утечка 8 байт:
Код:
A<int> a0, a1;
тут еще 20 байт:
Код:
B<int> b;
проверь Valgrind-ом
rrrFer вне форума Ответить с цитированием
Старый 18.09.2013, 09:57   #8
Diablero
Пользователь
 
Регистрация: 31.01.2011
Сообщений: 42
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Открой секрет, что это за говнокод? - чего ты им хочешь добиться?

тут утечка 8 байт:
Код:
A<int> a0, a1;
тут еще 20 байт:
Код:
B<int> b;
проверь Valgrind-ом
Пытаюсь реализовать обобщённый MVC из статьи http://www.rsdn.ru/article/patterns/generic-mvc.xml на плюсах. Это демо-пример, я написал его, чтобы понять почему не работает плюсовый аналог вот этого кода на жабе: http://www.rsdn.ru/article/patterns/...-mvc.xml#EODAE (Модель списка) . Создал абстрактный класс подписчика модели
PHP код:
 templatetypename P >
class 
i_model_subscriber 
, класс простой модели (издатель)
PHP код:
templatetypename P >
class 
model 
, проблемы начались, когда стал писать класс модели списка, которая является одновременно подписчиком своих элементарных моделей и издателем для собственных подписчиков
PHP код:
templatetypename P >
class 
vector_model: public modelvectormodel> > >,
                    public 
i_model_subscriber
, запутался в указателях.
Деструкторы не добавил из лени)

Последний раз редактировалось Diablero; 18.09.2013 в 10:32.
Diablero вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
использование шаблонов Diego__ Общие вопросы C/C++ 6 13.03.2012 01:08
Переделка шаблонов ! ! ! Fanat31 WordPress и другие CMS 2 22.01.2011 12:42
Создание шаблонов artemavd Общие вопросы Delphi 4 29.09.2010 17:21
Использование шаблонов s180 Microsoft Office Word 5 10.12.2009 16:17