所以,我变得臭名昭着
未定义的引用'vtable ...
以下代码的错误(有问题的类是CGameModule.)我不能为我的生活理解问题所在.起初,我认为这与忘记给虚拟功能一个身体有关,但据我所知,一切都在这里.继承链有点长,但这里是相关的源代码.我不确定我应该提供哪些其他信息.
注意:构造函数是发生此错误的地方,看起来如此.
我的代码:
class CGameModule : public CDasherModule {
public:
CGameModule(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CDasherInterfaceBase *pInterface, ModuleID_t iID, const char *szName)
: CDasherModule(pEventHandler, pSettingsStore, iID, 0, szName)
{
g_pLogger->Log("Inside game module constructor");
m_pInterface = pInterface;
}
virtual ~CGameModule() {};
std::string GetTypedTarget();
std::string GetUntypedTarget();
bool DecorateView(CDasherView *pView) {
//g_pLogger->Log("Decorating the view");
return false;
}
void SetDasherModel(CDasherModel *pModel) { m_pModel = pModel; }
virtual void HandleEvent(Dasher::CEvent *pEvent);
private:
CDasherNode *pLastTypedNode;
CDasherNode *pNextTargetNode;
std::string m_sTargetString;
size_t m_stCurrentStringPos;
CDasherModel *m_pModel;
CDasherInterfaceBase …
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个游戏菜单系统,我有屏幕和屏幕元素的标准层次结构.(屏幕包含一些屏幕元素集合).我希望屏幕元素将事件发送到屏幕类以声明它已被选中.但是,在这种情况下我不需要任何事件参数.我不确定在没有任何参数的情况下创建事件的语法是什么.我找到了一个将播放器索引作为事件参数传递的解决方案.(我的游戏严格来说是单人游戏,所以这不是必需的.)
public event EventHandler<PlayerIndexEventArgs> Selected;
Run Code Online (Sandbox Code Playgroud)
^ - 如何在EventIndexEventArgs从EventArgs继承的地方声明此事件.我可以省略PlayerIndexEventArgs,还是有默认类型在这里使用不发送参数?(也许只是EventArgs基类?)
我如何定义一个函数,它将迭代器作为输入作为任何类型的STL容器,但仅限于特定模板类型的那些.例如:
任何形式的迭代器std::list<Unit*>::iterator
或 std::vector<Unit*>::iterator
我只想定义要采用的函数std::list<Unit*>::iterator
,但是如果我们切换到不同的STL容器,我不想更改我的代码.
有没有办法用模板或其他方式做到这一点?
我在A类中有两个包含其他类对象B和C的向量.我确切地知道这些向量应该保持多少元素.在A类构造函数的初始化列表中,我将这些向量初始化为它们的最大大小(常量).
如果我理解正确的话,我现在有一个B类对象的向量,它们已经使用它们的默认构造函数进行了初始化.对?当我编写这段代码时,我认为这是处理事情的唯一方法.但是,我已经学会了std::vector.reserve()
,我想要实现不同的东西.
我想为这些向量分配内存以尽可能大,因为添加到它们是由用户输入控制的,所以我不想频繁的调整.但是,我每秒迭代这个向量很多次,而且我目前只处理我标记为"活动"的对象.必须在每次迭代时检查B/C类的布尔成员是愚蠢的.我不希望这些对象甚至在那里为我的迭代器看我何时运行这个列表.
是提前保留最大空间并使用push_back
向向量添加新对象的解决方案吗?
我对Linux环境的编程很新,所以我不知道要搜索什么才能自己回答这个问题.我需要了解应用程序如何将shell设置为接受某个命令来启动它们.例如,您可以通过执行命令firefox从命令行启动Firefox.
我不知道这个定义在哪里.Makefile文件?配置脚本?在源代码本身?
任何关于Linux编程花絮的资源/阅读都会非常感激!
谢谢.
如果我从值类型声明一个可空(通过Nullable或?符号)变量,它是否仍然遵循值类型的规则(即默认情况下传递值,当它超出范围时解除分配,而不是在垃圾收集器时运行)或它变成一个引用类型,因为它实际上是Nullable类型?
所以说我有这样一个类:
class A {
public:
A( SomeHugeClass* huge_object)
: m_huge_object(huge_object) {}
private:
SomeHugeClass* m_huge_object;
};
Run Code Online (Sandbox Code Playgroud)
如果有人使用这样的构造函数:
A* foo = new A(new SomeHugeClass());
Run Code Online (Sandbox Code Playgroud)
谁负责在构造函数中新建的对象上调用delete?在这种情况下,调用A构造函数的范围只能删除foo,因为SomeHugeClass是匿名的.
但是,如果有人像这样使用构造函数呢?
SomeHugeClass* hugeObj = new SomeHugeClass();
A* foo = new A(hugeObj);
Run Code Online (Sandbox Code Playgroud)
然后,调用者可以在某个时候调用delete hugeObj,对吗?
A的这种实现是否会破坏内存?
我正在研究一个以这种方式完成大量对象组合的项目,尽管我希望使用智能指针,但我必须与项目负责人讨论如何更改旧代码以便在我可以之前利用它.
我正在寻找使用SQL学习ADO.NET等.但是,我在家里度过了冬天,所以我远离学校已配置的服务器.我希望运行类似本地sql服务器和数据库的东西来练习和学习.我下载并安装了MS SQL Server 2008 Express,但我不知道该怎么做才能实现这一目标.有没有我可以参考的指南或材料来弄清楚如何实现这一目标?