1 Востаннє редагувалося Yola (12.01.2017 12:03:59)

Тема: Як мені використати using із заголовкового файлу, не включаючи його

Заголовковий файл:

using RenderItemId = std::list<grRenderItem>::const_iterator;

Інший заголовковий файл, в який я не хтів би включати перший заголовковий файл:

std::unique_ptr<RenderItemId> ri_;

Які в мене варіанти так, щоб не включати.
1. Використати справжній тип std::list<grRenderItem>::const_iterator - потворно
2. Таки включити - ууу

Є ще якісь? Бажано приємні:) Можна із заміною using на щось інше.

--------

Поки що зробив так:

    using RenderItemId = std::list<grRenderItem>::const_iterator;
    struct StructRenderItemId { RenderItemId Value; };

2

Re: Як мені використати using із заголовкового файлу, не включаючи його

Можливо допоможе? Я не перевіряв це

extern RenderItemId;

3

Re: Як мені використати using із заголовкового файлу, не включаючи його

unique_ptr на const_iterator? виглядає дуже дивно о_О
const_iterator це вказівник на кучу. Якщо дуже треба його повернути з функції, то це можна робити і без unique_ptr при умові що список живе в памяті

4

Re: Як мені використати using із заголовкового файлу, не включаючи його

hesting написав:

unique_ptr на const_iterator? виглядає дуже дивно о_О
const_iterator це вказівник на кучу. Якщо дуже треба його повернути з функції, то це можна робити і без unique_ptr при умові що список живе в памяті

what?
wtf?

Yola написав:

Заголовковий файл:

Не додивився зразу про що йде річ. В цьому випадку ви повинні користуватися включенням  - тому ці файли саме так і називаються.

5

Re: Як мені використати using із заголовкового файлу, не включаючи його

varkon написав:

what?
wtf?

Тобто ви одобряєте конструкцію типу

using RenderItemId = std::list<grRenderItem>::const_iterator;
std::unique_ptr<RenderItemId> ri_;

а як ri_ потім ініціалізувати?

ri_.reset(new myList.begin()); ???
а як взяти значення?
**ri__;  ???

6

Re: Як мені використати using із заголовкового файлу, не включаючи його

Ось це я зробив, щоб не включати цей файл, що оголошує grRenderItem в інші заголовкові файли:

    using RenderItemId = std::list<grRenderItem>::const_iterator;
    struct StructRenderItemId { StructRenderItemId(RenderItemId id) : Value(id) {} RenderItemId Value; };

Приклад іншого заголовкового файлу:

namespace Viewer
{
    struct StructRenderItemId;
}

    std::unique_ptr<Viewer::StructRenderItemId> boundingVolumeDesc_;

А ось і використання:

    #include "Viewer\Viewport.h"
    boundingVolumeDesc_ = make_unique<StructRenderItemId>(viewport_.CreateRenderItemTransparent(descsBV));
    if (boundingVolumeDesc_) viewport_.DestroyRenderItemTransparent(*boundingVolumeDesc_);

7

Re: Як мені використати using із заголовкового файлу, не включаючи його

ви собі на рівному місці створюєте проблеми.
unique_ptr було створено для того, щоб не займатися менеджментом памяті вручну.
видаляючи обєкт, який має бути знищений unique_ptr, ви вибиваєте табуретку у нього з під ніг

 viewport_.DestroyRenderItemTransparent(*boundingVolumeDesc_);

Скоріш за все, це код можна переписати так:

grRenderItem* renderItem = viewport_.CreateRenderItemTransparent(descsBV);
if (renderItem) {
    viewport_.DestroyRenderItemTransparent(renderItem);
}

8

Re: Як мені використати using із заголовкового файлу, не включаючи його

Вказівники і також unique_ptr, можна використовувати, щоб уникнути включення #include додаткових заголовкових файлів у заголовковий файл.

DestroyRenderItemTransparent не означає, що там відбувається delete ;)

9

Re: Як мені використати using із заголовкового файлу, не включаючи його

щоб уникнути зайвих включень в хідер, можна робити форвард декларейшн, а інклуд робити в сорцях