所以,我变得臭名昭着
未定义的引用'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) 如何将类对象(尤其是STL对象)传递给C++ DLL?
我的应用程序必须以DLL文件的形式与第三方插件交互,我无法控制这些插件构建的编译器.我知道STL对象没有保证ABI,我担心我的应用程序会导致不稳定.
可能重复:
如何在C++中声明接口?
这是关于C++的一般问题.如你所知,目前还没有明确的区分之间interface以及abstract class在C++与Java和C#.什么时候更喜欢用C++ interface代替abstract class?你能举一些例子吗?
可能重复:
在C++中模拟接口的首选方法
我很想知道C++中是否有接口,因为在Java中,设计模式的实现主要是通过接口将类解耦.有没有类似的方法在C++中创建接口呢?
众所周知,有些语言有接口的概念.这是Java:
public interface Testable {
void test();
}
Run Code Online (Sandbox Code Playgroud)
如何以最紧凑的方式在C++(或C++ 11)中实现这一点并且代码噪声很小?我很欣赏一个不需要单独定义的解决方案(让标题足够).这是一个非常简单的方法,即使我发现越野车;-)
class Testable {
public:
virtual void test() = 0;
protected:
Testable();
Testable(const Testable& that);
Testable& operator= (const Testable& that);
virtual ~Testable();
}
Run Code Online (Sandbox Code Playgroud)
这只是一个开始......而且已经超过了我想要的时间.怎么改进呢?也许在std命名空间的某个地方有一个基类专为此而设计?
由于C++缺少interfaceJava和C#的特性,在C++类中模拟接口的首选方法是什么?我的猜测是抽象类的多重继承.在内存开销/性能方面有什么影响?这种模拟接口是否有任何命名约定,例如SerializableInterface?
所以这是我所在的框.我想了解为什么在你的接口类中有一个"虚拟析构函数"很重要.如果你可以挂到最后,你会看到为什么那些东西在引号中...我也想让所有的词汇绝对正确.到目前为止,这是我处理过程的地方:
有时您有基类,有时您有从基类继承的派生类.
如果你有一个基指针,它发现自己指向一个派生对象,你还希望从该指针指向一个派生对象的成员函数调用,就像它实际上被调用一样从派生对象中,您调用的成员函数最好在基类中声明为virtual.
接口是任何只有纯虚函数的类.如果从此接口类派生新类并实现所有纯虚函数,则最终可以创建派生类的实例.
你永远不可能有一个接口类的实例,但你可以有一个指向接口类的实例.
如果你有一个实际指向派生类对象的指针接口类(实际上,我想如果#4是正确的话,它总是必须这样),如果你决定通过它删除那个对象你的指针,如果你的接口类中没有"虚拟析构函数",你破坏派生对象的意图只会作为一个调用来执行,以破坏基础对象(即接口类),因为没有虚拟析构函数,事物永远不会达到实际调用派生对象的析构函数的程度 - 从而导致内存泄漏.
唷.好的,如果这听起来是正确的,请回答我的问题.仅仅在你的界面中声明一个虚拟析构函数就足够了:
virtual ~iFace();
Run Code Online (Sandbox Code Playgroud)
这对我来说是错误的......所以如果你像这样使析构函数变为虚拟,会发生什么:
virtual ~iFace() = 0;
Run Code Online (Sandbox Code Playgroud)
既然它们只是声明,那么它们中的任何一个都算是"接口类中的虚拟析构函数"吗?你甚至可以有一个声明但未定义的析构函数吗?只有它是纯粹的虚拟我猜...
无论如何,所以回到标题问题......我真的要尽可能快......这是拍摄的钱......如果你的"界面类中的虚拟析构函数"需要至少一个像这样的空定义:
virtual ~iFace() {};
Run Code Online (Sandbox Code Playgroud)
那个成员函数不是纯虚拟的(不能因为你给了它一个定义),因此你的类不再是一个接口(它不仅包含纯虚拟成员函数).
这意味着如果为接口定义虚拟析构函数,则不再具有接口(而只是一些抽象基类).这只是滥用语言吗?我明白发生了什么吗?
注意:这一切都来自于问自己"什么是界面?" 然后阅读这个问题的答案: 你如何在C++中声明一个接口?
希望漫长的骑行时间不会太长,但我决心完全理解这些概念及其相关的词汇.
可能重复:
如何在C++中声明接口?
接口如c ++中的java?
我是一名学习C++的Java程序员,我想知道C++中是否存在类似Java接口的东西,即另一个类可以实现/扩展多个类的类.谢谢.ps新来的,告诉我,如果我做错了什么.
我目前正在处理的java代码通常具有类似的结构
文件Controller.java:
interface Controller {...}
Run Code Online (Sandbox Code Playgroud)
文件ControllerImpl.java:
class ControllerImpl implements Controller {...}
Run Code Online (Sandbox Code Playgroud)
但是对于每个接口,只有一个实现.这与在C/C++中使用头文件不同,我将代码拆分成文件
Controller.hpp
Controller.cpp
Run Code Online (Sandbox Code Playgroud)
据我所知,已经引入了C/C++中的头文件来帮助编译器,这在Java中是不再需要的.头文件也应该有助于代码的可读性,但是具有折叠和轮廓视图的现代IDE这也不再是必需的.
那么为什么人们通过对接口编程再次通过后门引入Java头文件呢?
c++ ×9
interface ×7
java ×3
abi ×1
abstract ×1
c++11 ×1
concept ×1
dll ×1
g++ ×1
gcc ×1
header-files ×1
inheritance ×1
oop ×1
overriding ×1
polymorphism ×1
pure-virtual ×1
stl ×1
terminology ×1
windows ×1