Войти
ФлеймФорумПрограммирование

Общие вопросы по программированию (300 стр)

Страницы: 1299 300 301 302314 Следующая »
#4485
15:41, 12 мая 2021

Есть кодяра:
// base.h

struct base_t {
   ...
};

void foo(base_t* base);

// base.cpp

void foo(base_t* base) {
   // Делаем чего-то с бэйзом
}

// derived.h

struct derived_t;

derived_t* new_derived(...);

// derived.cpp

struct derived_t : base_t {
   ...
};

derived_t* new_derived(...) {
   derived_t* der = new derived_t;
   ...
   return der;
}

// main.cpp

void main() {
  derived_t* der = new_derived(...);
  foo(der);
}

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


#4486
16:15, 12 мая 2021

nes
Как по мне тут только один вариант - явный каст. Только лучше этот каст сделать отдельной функцией с объясняющим происходящее названием. А вообще нафига тебе это?

#4487
16:23, 12 мая 2021

Vlad2001_MFS
Тогда уже void* и никаких кастов не нужно.

#4488
16:23, 12 мая 2021

Vlad2001_MFS
>А вообще нафига тебе это?
Мучу верчу свой екс.

#4489
(Правка: 17:53) 17:52, 12 мая 2021

nes
PImpl пробовал? Там можно прописать операторы кастов в обход наследования.

#4490
19:09, 12 мая 2021

Delfigamer
Это считай и есть пимпил.

#4491
20:15, 12 мая 2021

nes
> Как бы подсказать компулятиру, что дуривид наследник бази,
> не шаря при этом кишки его реализации с базей?

если под фразой "не шаря при этом кишки" ты подразумеваешь:
не отсвечивать декларацией классов в хэдерах,
тогда - никак.

#4492
21:38, 12 мая 2021

nes
сделать foo тимплейтом?

#4493
(Правка: 21:54) 21:53, 12 мая 2021

nes
> Это считай и есть пимпил.
Пимпл - это когда у тебя есть отдельный class base_t { struct base_impl_t* impl; }, и все функции работают только через эту обёртку - struct base_impl_t в принципе не выходит за пределы своего юнита, и без проблем мог бы быть вообще вынесен в отдельную длл вместе с соответствующей реализацией методов обёртки.
А у тебя - только forward declaration с указателями, да и он только на пол-шишечки.

#4494
(Правка: 22:35) 22:34, 12 мая 2021

Прошу прощения за занудство, но постфикс '_t' обычно появляется в результате объявления типа, а не структуры. В результате объявления структуры используют либо префикс S, либо постфикс _s, либо как-то иначе обосабливают, либо вообще никак. И да, на первый взгляд это не важно, но это не так. Дьявол кроется в деталях, которые важно понимать.

#4495
1:51, 13 мая 2021

totoro
> Прошу прощения за занудство, но постфикс '_t' обычно появляется в результате
> объявления типа, а не структуры.
Прошу прощения за занудство, но структура - это тип, а детали венгерской нотации - это вкусовщина.

#4496
8:23, 13 мая 2021

Kartonagnick
Под "не шаря кишки" я подразумевал спрятанную от интерфейса имплементацию в цпп или в либе.

kkolyan
>сделать foo тимплейтом?
Не.

Delfigamer
>Пимпл - это когда у тебя есть отдельный class base_t { struct base_impl_t* impl; }, и все функции работают только через эту обёртку
Пимпл это когда у тебя есть какой-то указатель и набор функций для работы с ним.

#4497
(Правка: 10:59) 10:58, 13 мая 2021

nes

Если видно объявление derived_t, то просто:
void foo(derived_t*)
а в cpp делай с ним что хочешь.

#4498
(Правка: 11:12) 11:12, 13 мая 2021

Ghost2
foo знает только base_t, с ним и работает.

В идеале нужно что-то такое:

// В хидере говорим что диривид есть наследник бази,
// более пользователь диривида ничего о нем знать не должон.
struct derived_t : base_t;

#4499
(Правка: 12:59) 12:59, 13 мая 2021

totoro
> Прошу прощения за занудство, но постфикс '_t'
тоже обратил на это внимание.

nes
> Под "не шаря кишки" я подразумевал спрятанную от интерфейса имплементацию в цпп
> или в либе.

ну так, а зачем ты спрятал декларацию класса от компилятора?

а теперь хочешь, что бы он как то догадался,
что классы - родственники.

Страницы: 1299 300 301 302314 Следующая »
ФлеймФорумПрограммирование