相关疑难解决方法(0)

未定义的vtable参考

所以,我变得臭名昭着

未定义的引用'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)

c++ gcc g++

315
推荐指数
18
解决办法
47万
查看次数

如何安全地将对象(尤其是STL对象)传入DLL或从DLL传递?

如何将类对象(尤其是STL对象)传递给C++ DLL?

我的应用程序必须以DLL文件的形式与第三方插件交互,我无法控制这些插件构建的编译器.我知道STL对象没有保证ABI,我担心我的应用程序会导致不稳定.

c++ windows dll stl abi

99
推荐指数
4
解决办法
3万
查看次数

C++中的抽象类与接口

可能重复:
如何在C++中声明接口?

这是关于C++的一般问题.如你所知,目前还没有明确的区分之间interface以及abstract class在C++与Java和C#.什么时候更喜欢用C++ interface代替abstract class?你能举一些例子吗?

c++ abstract-class interface

92
推荐指数
4
解决办法
18万
查看次数

如何在C++中实现接口?

可能重复:
在C++中模拟接口的首选方法

我很想知道C++中是否有接口,因为在Java中,设计模式的实现主要是通过接口将类解耦.有没有类似的方法在C++中创建接口呢?

c++ interface concept

70
推荐指数
3
解决办法
13万
查看次数

在C++ 11中声明接口的最佳方法

众所周知,有些语言有接口的概念.这是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++ polymorphism interface abstract c++11

46
推荐指数
5
解决办法
3万
查看次数

如何在C++中模拟接口?

由于C++缺少interfaceJava和C#的特性,在C++类中模拟接口的首选方法是什么?我的猜测是抽象类的多重继承.在内存开销/性能方面有什么影响?这种模拟接口是否有任何命名约定,例如SerializableInterface

c++ abstract-class interface naming-conventions

38
推荐指数
4
解决办法
1万
查看次数

32
推荐指数
1
解决办法
4万
查看次数

根据定义,不将"虚拟析构函数"置于接口中,使其不再是接口吗?

所以这是我所在的框.我想了解为什么在你的接口类中有一个"虚拟析构函数"很重要.如果你可以挂到最后,你会看到为什么那些东西在引号中...我也想让所有的词汇绝对正确.到目前为止,这是我处理过程的地方:

  1. 有时您有基类,有时您有从基类继承的派生类.

  2. 如果你有一个基指针,它发现自己指向一个派生对象,你还希望从该指针指向一个派生对象的成员函数调用,就像它实际上被调用一样从派生对象中,您调用的成员函数最好在基类中声明为virtual.

  3. 接口是任何只有纯虚函数的类.如果从此接口类派生新类并实现所有纯虚函数,则最终可以创建派生类的实例.

  4. 你永远不可能有一个接口类的实例,但你可以有一个指向接口类的实例.

  5. 如果你有一个实际指向派生类对象的指针接口类(实际上,我想如果#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++ terminology interface pure-virtual

26
推荐指数
3
解决办法
1万
查看次数

相当于C++中的Java接口?

可能重复:
如何在C++中声明接口?
接口如c ++中的java?

我是一名学习C++的Java程序员,我想知道C++中是否存在类似Java接口的东西,即另一个类可以实现/扩展多个类的类.谢谢.ps新来的,告诉我,如果我做错了什么.

c++ java abstract-class overriding virtual-inheritance

16
推荐指数
1
解决办法
2万
查看次数

针对Java中的接口编程与使用C/C++中的头文件的概念相同吗?

我目前正在处理的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++ java interface header-files

13
推荐指数
2
解决办法
5655
查看次数