Указатели функции C++ и классы

Чтобы увеличить размер кучи в IntelliJ IDEA, следуйте приведенным ниже инструкциям. Это работало для меня.

Для пользователей Windows

Перейдите в место, где установлена ​​среда IDE, и выполните поиск следующего.

idea64.exe.vmoptions

Отредактируйте файл и добавьте следующее.

-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m

Вот и все!

12
задан LogicStuff 22 December 2015 в 21:37
поделиться

6 ответов

Существует много способов освежевать эту кошку, включая шаблоны. Моим фаворитом является Boost.function, поскольку я нашел, что это является самым гибким в конечном счете. Также читайте на Boost.bind для привязки к функциям членства, а также многим другим приемам.

Это было бы похоже на это:

#include <boost/bind.hpp>
#include <boost/function.hpp>

void Render(boost::function0<void> Call)
{
    // as before...
}

Render(boost::bind(&MainMenu::Render, myMainMenuInstance));
14
ответ дан 2 December 2019 в 07:23
поделиться

Можно сделать функцию обертки void Wrap(T *t) это просто звонит t->Call() и имейте Render возьмите такую функцию вместе с объектом. Это:

void Wrap(T *t)
{
  t->Call();
}

void Render(void (*f)(T *), T *t)
{
  ...
  f(t);
  ...
}
3
ответ дан 2 December 2019 в 07:23
поделиться

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

void CallRender(myclass *Instance)
{
  Instance->Render();
}

Таким образом, рендеринг становится:

void Render(void (*Call)(myclass*), myclass* Instance)
{
  ...
  Call(Instance);
  ...
}

И Ваш вызов для рендеринга:

Render(CallRender, &MainMenu);

Я знаю, что это ужасно, но работало на меня (я использовал pthreads),

1
ответ дан 2 December 2019 в 07:23
поделиться

Что относительно какой C++ FAQ: Указатели на участников говорят?

2
ответ дан 2 December 2019 в 07:23
поделиться

Вы не можете назвать функцию членства от указателя, если у Вас нет ссылки на объект также. Например:

((object).*(ptrToMember))

Таким образом, Вы не сможете достигнуть этого, не изменяя подпись Вашего метода рендеринга. Эта статья объясняет, почему это обычно - плохая идея.

Лучший путь мог бы состоять в том, чтобы определить интерфейс "Renderer", который Ваши классы, которые имеют методы рендеринга, могут реализовать и иметь это быть типом параметра Вашего основного Метода рендеринга. Вы могли затем записать реализацию "StaticCaller" для поддержки вызова статических методов ссылкой.

например, (Мой C++ действительно ржав, я не скомпилировал это ни один).



void Render(IRenderer *Renderer)
{
    D3dDevice->BeginScene();
    Renderer->Render();
    D3dDevice->EndScene();
    D3dDevice->Present(0,0,0,0);
}

// The "interface"
public class IRenderer 
{
public:
    virtual void Render();
};

public class StaticCaller: public IRenderer
{
    void (*Call)();
public:

    StaticCaller((*Call)())
    {
        this->Call = Call;
    }

    void Render()
    {
        Call();
    }
};

Все это - симпатичный шаблон, но он должен сделать для большей удобочитаемости.

1
ответ дан 2 December 2019 в 07:23
поделиться

Можно объявить указатель функции к функции членства использования класса T:

typedef void (T::*FUNCTIONPOINTERTYPE)(args..)
FUNCTIONPOINTERTYPE function;

И вызовите его как:

T* t;
FUNCTIONPOINTERTYPE function;
(t->*function)(args..);

Экстраполирование этого в полезную приправляющую карри систему с аргументами переменной, типами, возвращаемыми значениями, и т.д., является монотонным и раздражающим. Я услышал хорошие вещи о вышеупомянутой библиотеке повышения, таким образом, я рекомендовал бы изучить это прежде, чем сделать что-либо решительное.

0
ответ дан 2 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: