LINUX.ORG.RU

Как обратиться к std::shared_ptr<void> ???

 


0

2

Подскажите как правильно тип привести, чтобы подсчет ссылок не поломался?

Чтобы не усложнять линковку при компиляции решил в заголовочном файле в классе сделать замену

std::shared_ptr<linphone::Core> core >>> std::shared_ptr<void> core

проинициализировалось

auto factory = linphone::Factory::get();
core = factory->createCoreWithConfig(config, nullptr);

Как теперь здесь обратиться корректно???

...core...->addListener(std::make_shared<ClientCoreListener>())
★★★

Чтобы не усложнять линковку

Например? Потому что пока что твоё решение выглядит как усложнение. Как по-твоему умный указатель будет удалять void? Где он будет искать деструктор linphone::Core?

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

приходится тащить заголовочные файлы от либы в заголовочный файл класса

Попробуй вместо подключения заголовочникоа сделать forward declaration класса.

ox55ff ★★★★★
()

Сделал type erasure, теперь нужно рассказывать компилятору тип reinterpret_cast’ом (лучше, конечно, start_lifetime_as брать, но его нет нигде пока):

#include <fmt/printf.h>
#include <stdint.h>
#include <memory>

struct Test {
    uint32_t i;
    uint32_t j;
};

int main() {
    std::shared_ptr<void> ptr{new Test{1, 2}};
    //Test& test = *std::start_lifetime_as<Test*>(ptr.get());
    Test& test = *reinterpret_cast<Test*>(ptr.get());
    fmt::print("{}, {}.\n", test.i, test.j);
}

Или я просто чего-то не понял? Тогда проясни подробнее в чём проблема.

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

не знаю будет ли работать, но компилятор прожувал такое ))

(std::static_pointer_cast<linphone::Core>(core))->addListener(std::make_shared<ClientCoreListener>());
wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

«Creates a new instance of std::shared_ptr»

Ты создаёшь шаредптр, дёргаешь атомарные счётчики и т.п. просто чтобы сразу его удалить. В чём смысл? Простого reinterpret_cast тут достаточно.

Но вообще лучше делай forward_declaration, как тебе предлагали выше. Оно и проще и удобнее.

#include <fmt/printf.h>
#include <stdint.h>
#include <memory>

struct Test; //<- Forward declaration.

std::shared_ptr<Test> g_ptr;


struct Test {
    uint32_t i;
    uint32_t j;
};

int main() {
    g_ptr = std::make_shared<Test>(1, 2);
    fmt::print("{}, {}.\n", g_ptr->i, g_ptr->j);
}
Ivan_qrt ★★★★★
()
Последнее исправление: Ivan_qrt (всего исправлений: 1)
Ответ на: комментарий от wolverin

forward declaration пробовал? Это будет самый адекватный подход. Касты через void это костыли.

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

у меня от силы С++14, не подходит

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

структура для одной единственной переменной…

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

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

Ты что-то типа такого хочешь? Вообще по-чётче мысли формулируй, не бойся лишние буквы потратить, а то нифига не понятно же.

#include <fmt/printf.h>
#include <stdint.h>
#include <memory>

struct Test;

std::shared_ptr<Test> g_ptr;


struct Test {
    uint32_t i;
    uint32_t j;

    struct SubTest;
    SubTest* sub;
};

struct Test::SubTest {
    uint32_t k;
};

int main() {
    Test::SubTest sub{3};
    g_ptr = std::make_shared<Test>(1, 2);
    g_ptr->sub = &sub;
    fmt::print("{}, {}, {}.\n", g_ptr->i, g_ptr->j, g_ptr->sub->k);
}
Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

так получается верно???

заголовок

class CSIP
{
private:
    struct stCore_t;
    stCore_t * core;

public:
CSIP();

~CSIP() {}
};

файл реализации

struct CSIP::stCore_t { std::shared_ptr<linphone::Core> ptr; };

CSIP::CSIP()
{
    auto factory = linphone::Factory::get();

    core = new stCore_t({factory->createCoreWithConfig(config, nullptr)});

}

выглядит этот NEW конечно по тупому!

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

потому что это потребует втащить в заголовок инклуды библиотеки и потом весь проект компилировать таща их за собой!

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

И чтобы этого не делать у тебя есть forward declaration, о чём весь тред собственно. Объявляешь forward declaration для linphone::coro, а в cpp подключаешь заголовочные файлы.

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

Ну это к тебе вопрос, это же ты код пишешь. Ровно для тех же целей, для которых ты std::shared_ptr<void> создавал.

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

Какие ссылки отслеживать? Ты о чём вообще? Я реально не могу понять что ты хочешь получить и в чём возникает проблема при fd. Подробно это опиши.

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

В порядке предположения: может ты не понимаешь, что заголовчные файлы libphone тебе нужно будет подключать только в тех cpp, в которых ты непосредственно используешь методы libphone::coro, а не во всех, куда подключен твой хэдер?

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

так вот же код реализации я привел на форвардинге этом

Как обратиться к std::shared_ptr<void> ??? (комментарий)

где создается указатель на shared_ptr

файл реализации содержит кучу инклудов из нестандартных мест, он собирается в объектник, при этом инклуды от либы никуда больше не мигрируют, а main файл просто линкует как обычно объектники

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

у меня переменная описана с типом класса в заголовке - в этом проблема инклудов

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

Отлично. И зачем тебе там stCoro_t ты так и не ответил. В чём проблема просто взять std::shared_ptr<libphone::coro> с предварительным fd? Что по-твоему от этого поменяется?

Ivan_qrt ★★★★★
()
Последнее исправление: Ivan_qrt (всего исправлений: 1)
Ответ на: комментарий от wolverin

Forward declaration, чел. Forward, блин, declaration. Объявляешь его для libphone::coro перед объявлением класса CSIP и не добавляешь инклюд libphone. Что тут может быть вообще не понятно-то?

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

или может у вас вопрос в том, что

factory->createCoreWithConfig(config, nullptr);

возвращает мне

std::shared_ptr<linphone::Core>

а не какой то

linphone::Core
wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

Это форвард декларация класса stCoro_t (первая строка). Вторая просто объявление указателя. Форвард декларация libphone::coro где?

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

Форвард декларация выглядит так: class CLASS_NAME; и просто говорит компилятору, что где-то есть такой класс. У меня в примере это было

struct Test; //<- Forward declaration.

и даже комментарий добавлен.

И для libphone::coro у тебя её нет. Так добавь её и используй std::shared_ptr<libphone::coro> без всякой лишней херни. И перестанешь удивляться, почему у тебя хреновый код получается.

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

Надо сделать форвард декларацию для libphone::coro.

namespace libphone { struct coro; }

Ну или ещё как-то, как именно объявляется и чем является libphone::coro смотри в соответствующем заголовочном файле. Я в него не заглядывал.

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

Какая разница куда оно лезет. Это же не include. Просто декларация, что где-то в природе существует linphone::Core. Всё. Это стандартный способ сделать то, что ты хочешь. Только с unique_ptr не будет работать. Это я на будущее.

ox55ff ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.