LINUX.ORG.RU

С++ определение переменной в заголовке

 , , ,


0

2

Проблема: есть заголовок базового класса, но нет .cpp, нужно в этот базовый класс сунуть переменную, то есть нужно ее еще там же определить, как это сделать только лишь в заголовке? Компилятор привычно матерится...

Перемещено maxcom из linux-org-ru

есть заголовок базового класса, но нет .cpp

Ты хочешь изменить реализацию класса, не имея его исходников?
Наследуйся от него и переопределяй в нем все, что нужно, по иному никак.

Или вся реализация класса находится в .h, так как класс шаблонный? Тогда ты что-то не так делаешь.

kravich ★★★★
()
Ответ на: комментарий от kravich

Наследуйся от него и переопределяй в нем все, что нужно, по иному никак.

Тогда возникает куча проблем с типами, смысле этот класс много где вызывается, если я наследую от него, и пытаюсь вызывать так же как вызывал базовый, то проблема с типами, мол невозможна конвертация из Base* в MyClassChildrenBase*.

ioexception
() автор топика
Ответ на: комментарий от kravich

Вот такая ошибка возникает если наследовать и использовать наследуемый: значение типа «Base *» нельзя использовать для инициализации сущности типа «MyClassChildrenBase *»

ioexception
() автор топика
Ответ на: комментарий от ioexception

значение типа «Base *» нельзя использовать для инициализации сущности типа «MyClassChildrenBase *»

Все правильно. Ты создаешь экземпляр Base, а работать с ним хочешь как с экземпляром MyClassChildrenBase. Создавай сразу MyClassChildrenBase.

kravich ★★★★
()
Ответ на: комментарий от kravich

Создавай сразу MyClassChildrenBase.

Это как, можешь примером объяснить? Так что ли:

MyClassChildrenBase mccb = MyClassChildrenBase();
//и потом только 
mccb* ...

ioexception
() автор топика
Ответ на: комментарий от ioexception

MyClassChildrenBase mccb = MyClassChildrenBase()

Да. Либо создавать экземпляр динамически, если нужно:

MyClassChildrenBase *mccb_ptr = new MyClassChildrenBase()


mccb* ...

Эта запись некорректна. mccb - это переменная, она не может быть использована в качестве типа при объявлении указателя. Тип у тебя - MyClassChildrenBase.

Похоже, ты хочешь сделать что-то вроде такого:

MyClassChildrenBase mccb;
MyClassChildrebbase *mccb_ptr = &mccb;
mccb_ptr->doWork();


Только ответь, зачем тебе в данном случае указатель на экземпляр класса? Ты собираешься передавать его куда-то дальше, чтобы потом его там заюзать?

kravich ★★★★
()
Ответ на: комментарий от kravich

Ты собираешься передавать его куда-то дальше, чтобы потом его там заюзать?

Именно так, причем класс принимающий я тоже изменить не могу. Он то и ругается что я ему иной тип подсовываю.

ioexception
() автор топика
Ответ на: комментарий от ioexception

причем класс принимающий я тоже изменить не могу

Не можешь изменить тип переменной, принимающей указатель на экземпляр класса?

Вообще то, указатель на экземпляр дочернего класса можно без проблем привести к типу указателя на базовый класс. При этом, работая с экземпляром дочернего класса через интерфейс базового класса, будет доступна вся функциональность, определенная в базовом классе.

Если же тебе нужна функциональность, появившаяся в дочернем классе (например, ты добавил в него новый метод или переменную), то ничего не мешает привести указатель на базовый класс обратно к типу указателя на дочерний класс. Главное, чтобы по указателю лежал экземпляр именно дочернего класса. Хотя делать так, как правило, не очень хорошо. Читай про dynamic_cast, reinterpret_cast, static_cast, const_cast.

Кроме того, почитай про виртуальные методы vs невиртуальные методы, чтобы понять, какие реализации методов будут вызваны при обращении к экземпляру класса через его родной интерфейс и через интерфейс его предка.

kravich ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.