代码之家  ›  专栏  ›  技术社区  ›  KernelPanic

没有实现文件(.cpp)的派生类

  •  1
  • KernelPanic  · 技术社区  · 6 年前

    bthidtransport.h :

    class BtHidTransport
    {
    public:
        BtHidTransport();    // constructor
    
    protected:
        virtual ~BtHidTransport();   // destructor
    }    // BtHidTransport
    

    bthidtransport.cpp

    BtHidTransport::BtHidTransport
    {
    }   // constructor
    
    BtHidTransport::~BtHidTransport()
    {
    }   // destructor
    


    bthid.h :

    #include "bthidtransport.h"
    
    class BtHidTransportFixes : public BtHidTransport
    {
        BtHidTransportFixes(); // constructor
        virtual ~BtHidTransportFixes();    // destructor
    }   // BtHidTransportFixes
    

    但特别是项目,, 没有实施( )文件。项目本身构建时没有错误。如果我在运行时使用以下命令从类实例化新对象:

    BtHidTransport* createdObject=new BtHidTransportFixes();
    

    BtHidTransportFixes .cpp )对于父类,执行的顺序是什么?我正在使用 适用于Windows的Eclipse 4.3.2 Windows 7 64位终极版 手臂DS-5.20.2 编译器。没有实施该计划 BtHidTransportFixes 所有项目文件 . 编译器优化将使用关闭 -O0 旗帜 . 以下是构建过程的汇编程序列表:

    ;;;107        // Create the BT transport first
    ;;;108        BtHidTransport *btTransport = new BtHidTransportFixes();
    00002a  2088              MOVS     r0,#0x88
    00002c  f7fffffe          BL       _ZN16StartupAllocatednwEj ; StartupAllocated::operator new(unsigned)
    000030  4934              LDR      r1,|L1.260|
    000032  2200              MOVS     r2,#0
    000034  9100              STR      r1,[sp,#0]
    000036  4b34              LDR      r3,|L1.264|
    000038  4611              MOV      r1,r2
    00003a  f7fffffe          BL       _ZN19BtHidTransportFixesC1EP9BtHidConnP13BtPairingListPK14tBTM_APPL_INFOPK23tBTM_LINK_EVT_CALLBACKS ; BtHidTransportFixes::BtHidTransportFixes()
    00003e  4604              MOV      r4,r0
    

    和链接器输出:

    Stack Usage for BtHidTransportFixes::BtHidTransportFixes() 0x0 bytes.
    Stack Usage for BtHidTransportFixes::BtHidTransportFixes() 0x0 bytes.
    Stack Usage for BtHidTransportFixes::BtHidTransportFixes__sub_object() unknown bytes.
    BtHidTransportFixes::BtHidTransportFixes() 0x0020587d   Thumb Code     0  20730_ram_ext.symdefs ABSOLUTE
        BtHidTransportFixes::BtHidTransportFixes__sub_object() 0x0020587d   Thumb Code     0  20730_ram_ext.symd
    

    3 回复  |  直到 6 年前
        1
  •  6
  •   StoryTeller - Unslander Monica    6 年前

    4 每个程序应包含每个程序的一个定义 无需诊断 . 这个 定义可以显式出现在程序中,可以在 标准或用户定义的库,或(在适当时)它是 隐式定义(请参见[class.ctor]、[class.dtor]和[class.copy])。 在丢弃语句之外使用odr的单元。

        2
  •  2
  •   Stephan Lechner    6 年前

    如果一个程序缺少声明成员函数的实现,那么就根本没有执行——链接器将无法构建可执行文件。

    缺少实现的唯一无关紧要的事情是,是否从未使用相应的类。在这种情况下,链接器永远不会被迫寻找实现。

    但是,如果您的程序包含(如您所述)以下行

    DerivedClass* derivedClass=new DerivedClass();
    

    程序格式不正确(链接器应该抱怨)。

        3
  •  0
  •   KernelPanic    6 年前

    我找到了解决这个问题的办法。生成过程文件( 公司 )指示替换头文件 bthid.h 打补丁 bthid.h Windows用户主目录

    BtHidTransportFixes::BtHidTransportFixes(BtHidConn            *btHidConn, 
                                             BtPairingList        *hostList, 
                                             const tBTM_APPL_INFO *btmSecCallbacks,
                                             const tBTM_LINK_EVT_CALLBACKS *btmLinkEvtCb) :
        BtHidTransport(btHidConn, hostList, btmSecCallbacks, btmLinkEvtCb)
    {
        #ifdef PROXIMITY_ASSOCIATION_SUPPORT
            // Initialize the observer to NULL
            proxAssocObserver.pObj = NULL;
        #endif
        #ifdef FIX_NEED_DISCOVERYLED_TICK
            discoveryTickEnabled = hidAppConfig.discoveryLedEnabled;
    
            discoveryTickBasePeriodInMs = 50;
        #endif
    
        #ifdef FIX_CQ_911035
            ucdConnectRequested = FALSE;
        #endif
    }
    

    公司 命令包括补丁,添加了新的实现文件来构建过程,现在它就像一个符咒一样工作。