Чтобы увеличить размер кучи в IntelliJ IDEA, следуйте приведенным ниже инструкциям. Это работало для меня.
Для пользователей Windows
Перейдите в место, где установлена среда IDE, и выполните поиск следующего.
idea64.exe.vmoptions
Отредактируйте файл и добавьте следующее.
-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m
Вот и все!
Существует много способов освежевать эту кошку, включая шаблоны. Моим фаворитом является 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));
Можно сделать функцию обертки void Wrap(T *t)
это просто звонит t->Call()
и имейте Render
возьмите такую функцию вместе с объектом. Это:
void Wrap(T *t)
{
t->Call();
}
void Render(void (*f)(T *), T *t)
{
...
f(t);
...
}
Я сделал так однажды путем определения глобального функционального "Вызова", который принимает указатель на экземпляр как участник
void CallRender(myclass *Instance)
{
Instance->Render();
}
Таким образом, рендеринг становится:
void Render(void (*Call)(myclass*), myclass* Instance)
{
...
Call(Instance);
...
}
И Ваш вызов для рендеринга:
Render(CallRender, &MainMenu);
Я знаю, что это ужасно, но работало на меня (я использовал pthreads),
Что относительно какой C++ FAQ: Указатели на участников говорят?
Вы не можете назвать функцию членства от указателя, если у Вас нет ссылки на объект также. Например:
((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();
}
};
Все это - симпатичный шаблон, но он должен сделать для большей удобочитаемости.
Можно объявить указатель функции к функции членства использования класса T:
typedef void (T::*FUNCTIONPOINTERTYPE)(args..)
FUNCTIONPOINTERTYPE function;
И вызовите его как:
T* t;
FUNCTIONPOINTERTYPE function;
(t->*function)(args..);
Экстраполирование этого в полезную приправляющую карри систему с аргументами переменной, типами, возвращаемыми значениями, и т.д., является монотонным и раздражающим. Я услышал хорошие вещи о вышеупомянутой библиотеке повышения, таким образом, я рекомендовал бы изучить это прежде, чем сделать что-либо решительное.