我的系统在构建boost库时遇到了问题.据我所知,大多数boost库(幸运的是)只是不需要构建的头文件(有一些例外).是否需要构建boost :: signals2库?boost.signals2库是否依赖于boost.signals库?
这个函数检查用户输入的函数名称到我正在进行的解释器/解析器中,将它与函数数组进行比较,并执行相应的C++函数.只要用户输入正确的函数名称,它就可以正常工作,但是如果没有用户输入的名称功能,解释器会以一些无法解释的运行时错误结束,即使我将其编程为打印"未定义函数"然后继续解析循环:
void parser::eval_cmd(std::string& exp, pro::command fset[])
{
expr = exp;
exp_ptr = (char*) expr.c_str();
bool found = false;
for (int i = 0; i < (int)sizeof(fset); i++)
{
if (fset[i].check(expr))
{
found = true;
exp_ptr = (char*)expr.c_str() + (fset[i].name.size() - 1);
if (fset[i].cmd)
fset[i].cmd(eval_args());
break;
}
}
if (!found) err::show(err::UNDEFINED);
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我想在Gtk中创建一个Window(Gtk#是特定的,但GTK +或任何其他绑定都可以,函数通常是相同的)没有标题.有点像Mozilla Firefox 4和Google Chrome.我不知道该怎么称呼,标题少或标题上的小部件?任何帮助?谢谢
有没有办法在Java中使用内部静态变量?例如,拿这个C代码:
void increment(){
static int i = 0;
i++;
printf("%i",i);
}
Run Code Online (Sandbox Code Playgroud)
我怎么用Java做这个?
直接代码:
class ArithmeticExpressionParser<T> : Parser
{
T num1, num2;
/* ......... */
void ParseNumber()
{
string temp = String.Empty;
while (char.IsDigit(PeekNextToken()))
{
GetNextToken();
temp += Token;
}
num1 = T.Parse(temp); // <<< the problem
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果我正在使用int或double我只是使用int.Parse等我已经尝试了铸造num1 = (T)temp;,这是行不通的.我怎样才能做到这一点,而无需编写自定义string来T发挥作用?
当我尝试这样做时,我只是在搞乱模板:
template<typename T> void print_error(T msg)
{
#ifdef PLATFORM_WIN32
::MessageBox(0, reinterpret_cast< LPCSTR >(msg), "Error", MB_ICONERROR|MB_OK);
#else
cout << msg << endl;
#endif /* PLATFORM_WIN32 */
}
Run Code Online (Sandbox Code Playgroud)
当然,如果你通过std::stringas,这显然是行不通的T.因为字符串不能转换为a char*,但是这个函数是否可以以允许我传递c样式char*数组和c ++ std::string作为参数的方式进行编码,并将它们转换为LPCSTR?
这是我pro::surface班级的(相关)代码:
/** Wraps up SDL_Surface* **/
class surface
{
SDL_Surface* _surf;
public:
/** Constructor.
** @param surf an SDL_Surface pointer.
**/
surface(SDL_Surface*);
/** Overloaded = operator. **/
void operator = (SDL_Surface*);
/** calls SDL_FreeSurface(). **/
void free();
/** destructor. Also free()s the internal SDL_Surface. **/
virtual ~surface();
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,在我的main函数中,对象会free()在真正的渲染开始之前破坏自身(并因此调用危险的SDL视频表面的析构函数!).
int main(int argc, char** argv)
{
...
// declared here
pro::surface screen = SDL_SetVideoMode(320,240,16,SDL_HWSURFACE|SDL_DOUBLEBUF);
// event-handling done here, but the Video Surface is already freed! …Run Code Online (Sandbox Code Playgroud) class MyMap : std::map<char, pro::image>
{
public:
void MyMethod(char x);
/** code **/
}
void MyMap::MyMethod(char x)
{
pro::image my_img; // note that my_img is a local variable
my_img.LoadFromFile("my_image.png");
this->insert(std::pair<char, pro::image>(x, my_img)); // stored in the class
}
Run Code Online (Sandbox Code Playgroud)
现在,这段代码安全吗?基本上,做MyMap存储拷贝的my_img时候insert,或者它存储的参考?
我正在使用C++在SDL上创建一个Gui库.(不要问我原因,为了理解Gui库是如何制作的,我只是为了从实践中获得一些知识.)而且我想创建一个像gtk +或wxWidgets这样的信号连接系统......
g_signal_connect(mybutton,"clicked",gtk_main_quit); //Gtk+
EVT_MENU(wxID_EXIT,OnQuit); //WxWidgets
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用函数指针来做到这一点.但是如何将这些函数添加到主循环中?
或者有更好的方法吗?
我通常避免使用类指针,因为引用似乎更有效.但我最近被迫使用它们,因为它们提供了唯一(高效且简单)的解决方案,在windows api包装器中使用window id绑定函数.我创建了一个WinControl类的数组.在我的WinHandler类中,它处理WndProc(窗口过程)并将程序中使用的所有小部件添加到该数组中.
class WinControl //These are not the entire classes, just the significant parts.
{
public:
int WinID;
virtual void Click(void) = 0; //Pure Virtual Function.
}
class WinHandler
{
WinHandler() : WCount(0) { }
WinControl* WidgetSet[MAX_LENGTH]; // Or I can use an STL vector...
int WCount;
void AddWidget(Widget* w) { WCount++; WidgetSet[WCount] = w; }
}
Run Code Online (Sandbox Code Playgroud)
然后我用:
if (WidgetSet[i]->ID == LOWORD(wParam)) WidgetSet[i]->Click();
Run Code Online (Sandbox Code Playgroud)
从长远来看,这种做法是否正常?由于实际存储在WidgetSet中的对象都是WinControl类的衍生物.有谁能建议更好的方法?
注意:我试图让我的问题尽可能清楚.如果你仍然无法得到我所要求的,请发表评论,我将尝试详细说明这个问题.