kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 RyanG
RyanG
Question

Nedefinit de referință pentru vtable

Atunci când construirea meu program C++, am'm obtinerea mesaj de eroare

nedefinit de referință pentru 'vtable...

Care este cauza acestei probleme? Cum pot repara asta?


Așa se întâmplă că am'm obtinerea de eroare pentru codul de mai jos (clasa în cauză este CGameModule.) și nu pot să-mi înțeleg care este problema. La început, am crezut că a fost legat de a uita pentru a da un virtual funcție de un corp, dar, din câte am înțeles, totul este aici. Moștenirea lanț este un pic cam lung, dar aici este legate de codul sursă. Am'm nu sunt sigur ce alte informații ar trebui să ofere.

Notă: constructorul este în cazul în care această eroare se întâmplă, l'd par.

Codul meu:

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 *m_pInterface;
};

Moștenește de la...

class CDasherModule;
typedef std::vector<CDasherModule*>::size_type ModuleID_t;

/// \ingroup Core
/// @{
class CDasherModule : public Dasher::CDasherComponent {
 public:
  CDasherModule(Dasher::CEventHandler * pEventHandler, CSettingsStore * pSettingsStore, ModuleID_t iID, int iType, const char *szName);

  virtual ModuleID_t GetID();
  virtual void SetID(ModuleID_t);
  virtual int GetType();
  virtual const char *GetName();

  virtual bool GetSettings(SModuleSettings **pSettings, int *iCount) {
    return false;
  };

 private:
  ModuleID_t m_iID;
  int m_iType;
  const char *m_szName;
};

Care moștenește de la....

namespace Dasher {
  class CEvent;
  class CEventHandler;
  class CDasherComponent;
};

/// \ingroup Core
/// @{
class Dasher::CDasherComponent {
 public:
  CDasherComponent(Dasher::CEventHandler* pEventHandler, CSettingsStore* pSettingsStore);
  virtual ~CDasherComponent();

  void InsertEvent(Dasher::CEvent * pEvent);
  virtual void HandleEvent(Dasher::CEvent * pEvent) {};

  bool GetBoolParameter(int iParameter) const;
  void SetBoolParameter(int iParameter, bool bValue) const;

  long GetLongParameter(int iParameter) const;
  void SetLongParameter(int iParameter, long lValue) const;

  std::string GetStringParameter(int iParameter) const;
  void        SetStringParameter(int iParameter, const std::string & sValue) const;

  ParameterType   GetParameterType(int iParameter) const;
  std::string     GetParameterName(int iParameter) const;

 protected:
  Dasher::CEventHandler *m_pEventHandler;
  CSettingsStore *m_pSettingsStore;
};
/// @}

#endif
310 2010-06-17T19:57:22+00:00 28
 Raedwald
Raedwald
Întrebarea editată 19 iunie 2019 в 12:30
Programare
gcc
c++
g++
Această întrebare are 1 răspuns în engleză, pentru a le citi, vă rugăm să vă logați.
Alexandre Hamez
Alexandre Hamez
17 iunie 2010 в 8:06
2010-06-17T20:06:48+00:00
Mai mult
Sursă
Editează
#10608433

De GCC FAQ are o intrare pe ea:

soluția este să se asigure că toate metodele virtuale care nu sunt pure sunt definite. Rețineți că un destructor trebuie să fie definite, chiar dacă acesta este declarat pur-virtual [clasa.dtor]/7.

GCC Frequently Asked Questions - GNU Project
gcc.gnu.org
383
0
 Dan
Dan
27 februarie 2013 в 1:53
2013-02-27T13:53:46+00:00
Mai mult
Sursă
Editează
#10608512

Pentru ceea ce merită, uitând un corp pe un destructor virtual generează următoarele:

nedefinit referire la `vtable pentru CYourClass'.

Eu sunt adăugarea o notă deoarece mesajul de eroare este înșelătoare. (Acest lucru a fost cu gcc versiune 4.6.3.)

Drew Noakes
Drew Noakes
Răspuns editat 12 aprilie 2013 в 10:25
152
0
Solution / Answer
 RyanG
RyanG
21 iunie 2010 в 6:22
2010-06-21T18:22:37+00:00
Mai mult
Sursă
Editează
#10608467

Deci, am'am dat seama de problema si a fost o combinație de logica rău și nu sunt complet familiarizați cu automake/autotools lume. Am fost adăugarea de fișierele corecte a mea Makefile.sunt model, dar nu't de sigur care pas în procesul de construire a creat de fapt makefile în sine. Deci, am fost compilarea cu un vechi makefile care nu a avut nici o idee despre noua mea fișiere de orice fel.

Multumesc pentru raspunsuri si link-ul de la CCG FAQ. Eu voi fi sigur de a citi că, pentru a evita această problemă, care apar pentru un motiv real.

52
0
 gluk47
gluk47
12 ianuarie 2015 в 10:43
2015-01-12T22:43:07+00:00
Mai mult
Sursă
Editează
#10608582

Dacă sunteți folosind Qt, încercați revedea qmake. Dacă această eroare este în widget's class, qmake-ar putea să nu observați că ui clasa vtable ar trebui să fie regenerat. Această rezolvat problema pentru mine.

 gluk47
gluk47
Răspuns editat 7 mai 2015 в 9:03
46
0
 Will
Will
11 februarie 2014 в 11:01
2014-02-11T23:01:22+00:00
Mai mult
Sursă
Editează
#10608558

Pur și simplu am primit această eroare deoarece fișierul nu a fost în makefile.

42
0
Srinivasa Lakkaraju
Srinivasa Lakkaraju
27 aprilie 2013 в 5:07
2013-04-27T05:07:04+00:00
Mai mult
Sursă
Editează
#10608538

Nedefinit de referință pentru vtable pot să apară datorită următoarelor situație, de asemenea,. Doar să încercați acest lucru:

Clasa A Conține:

virtual void functionA(parameters)=0; 
virtual void functionB(parameters);

Clasa B Contine:

  1. Definiția de mai sus tulb.
  2. Definiția de mai sus functionB.

Clasa C Conține: Acum're scris o Clasă C în care aveți de gând pentru a obține de la Clasa A.

Acum, dacă încercați să compilați veți obține Nedefinit de referință pentru vtable pentru Clasa C ca eroare.

Motiv:

functionA este definit ca pur virtuale și definiția acestuia este prevăzută în Clasa B. functionB este definit ca virtual (NU VIRTUALE PURE) așa că încearcă să-și găsească o definiție în Clasă în sine, dar cu condiția de definiție în Clasa B.

Soluție:

  1. Face funcția B ca pur virtuală (dacă aveți cerință de genul asta) virtual void functionB(parametri) =0; (Aceasta funcționează este Testat)
  2. Oferi o Definiție pentru functionB în Clasa în sine menținându-l ca virtual . (Sper că funcționează ca am n't încercați acest lucru)
 Aza
Aza
Răspuns editat 27 aprilie 2013 в 5:30
42
0
Shital Shah
Shital Shah
10 mai 2016 в 8:35
2016-05-10T20:35:07+00:00
Mai mult
Sursă
Editează
#10608608

Există o mulțime de speculații întâmplă în diverse răspunsuri aici. Am'll de mai jos da o destul de minime cod care reproduce această eroare și să explice de ce apare.

Destul de Minime Cod pentru a Reproduce Această Eroare

IBase.che

#pragma once

class IBase {
    public:
        virtual void action() = 0;
};

Derivate.che

#pragma once

#include "IBase.hpp"

class Derived : public IBase {
    public:
        Derived(int a);
        void action() override;
};

Derived.cpp

#include "Derived.hpp"
Derived::Derived(int a) { }
void Derived::action() {}

myclass.cpp

#include <memory>
#include "Derived.hpp"

class MyClass {

    public:
        MyClass(std::shared_ptr<Derived> newInstance) : instance(newInstance) {

        }

        void doSomething() {
            instance->action();
        }

    private:
        std::shared_ptr<Derived> instance;
};

int main(int argc, char** argv) {
    Derived myInstance(5);
    MyClass c(std::make_shared<Derived>(myInstance));
    c.doSomething();
    return 0;
}

Puteți compila acest lucru, folosind GCC astfel:

g++ -std=c++11 -o a.out myclass.cpp Derived.cpp

Acum puteți reproduce eroarea prin eliminarea = 0 în IBase.che. Primesc aceasta eroare:

~/.../catkin_ws$ g++ -std=c++11 -o /tmp/m.out /tmp/myclass.cpp /tmp/Derived.cpp
/tmp/cclLscB9.o: In function `IBase::IBase(IBase const&)':
myclass.cpp:(.text._ZN5IBaseC2ERKS_[_ZN5IBaseC5ERKS_]+0x13): undefined reference to `vtable for IBase'
/tmp/cc8Smvhm.o: In function `IBase::IBase()':
Derived.cpp:(.text._ZN5IBaseC2Ev[_ZN5IBaseC5Ev]+0xf): undefined reference to `vtable for IBase'
/tmp/cc8Smvhm.o:(.rodata._ZTI7Derived[_ZTI7Derived]+0x10): undefined reference to `typeinfo for IBase'
collect2: error: ld returned 1 exit status

Explicație

Observați că codul de mai sus nu are nevoie de nici virtual destructori, constructori sau orice alte fișiere suplimentare pentru a compila pentru a fi de succes (deși ar trebui să le aibă).

Cum să înțelegem această eroare este după cum urmează: Linker-ul este în căutarea pentru constructorul de IBase. Acest lucru va avea nevoie de ea pentru constructorul de Derivate. Cu toate acestea, ca Derivat suprascrie metode de IBase, a vtable atașat la acesta, care va referire IBase. Când linker spune "nedefinit de referință pentru vtable pentru IBase" aceasta înseamnă de fapt că Derivat a vtable referire la IBase dar poate't găsi orice obiect compilate codul de IBase să se uite în sus la. Deci, linia de jos este că clasa IBase a declarațiilor fără implementări. Acest lucru înseamnă o metodă în IBase este declarată virtuală, dar am uitat să-l marcați ca pur virtual SAU oferă definiția sa.

Despărțire Sfat

Dacă toate altceva nu reușește, atunci o modalitate de a depana această eroare este de a construi minim program care nu a compila și apoi să păstreze o schimba pentru ca se ajunge la starea pe care doriți. În între, ține strâns să vadă când începe să eșueze.

Notă pe ROS și Catkin construi sistemul

Dacă ai fost compilarea de mai sus set de clase în ROS folosind catkin construi sistemul atunci veți avea nevoie de următoarele linii în CMakeLists.txt:

add_executable(myclass src/myclass.cpp src/Derived.cpp)
add_dependencies(myclass theseus_myclass_cpp)
target_link_libraries(myclass ${catkin_LIBRARIES})

Prima linie de fapt spune că vrem să facem un executabil numit myclass și codul pentru a construi acest lucru poate fi găsit fișierele care urmează. Unul dintre aceste fișiere ar trebui să aibă main(). Observați că nu't trebuie să specificați .che fișiere de oriunde în CMakeLists.txt. De asemenea, don't trebuie să specificați Derived.cpp ca bibliotecă.

Shital Shah
Shital Shah
Răspuns editat 13 octombrie 2018 в 1:34
18
0
Philip Thomas
Philip Thomas
1 iulie 2015 в 2:55
2015-07-01T14:55:06+00:00
Mai mult
Sursă
Editează
#10608606

Am fugit într-o altă cauză pentru această eroare pe care le puteți verifica pentru.

Clasa de bază a definit o pur virtuale funcția ca:

virtual int foo(int x = 0);

Și subclasa a

int foo(int x) override;

Problema a fost typo că `"=0" a fost trebuia să fie în afara parantezelor:

virtual int foo(int x) = 0;

Deci, în cazul în care te're defilare de departe în jos, tu, probabil, nu't găsi răspunsul - acest lucru este ceva pentru a verifica.

Hugo Alonso
Hugo Alonso
Răspuns editat 1 iulie 2015 в 4:18
17
0
 Hazok
Hazok
19 ianuarie 2012 в 8:42
2012-01-19T08:42:02+00:00
Mai mult
Sursă
Editează
#10608490

Acest lucru se poate întâmpla destul de ușor dacă uitați să se leagă de obiect fișier care are definiție.

12
0
Iulian Popa
Iulian Popa
11 februarie 2015 в 3:23
2015-02-11T15:23:57+00:00
Mai mult
Sursă
Editează
#10608600

GNU C++ compiler trebuie să ia o decizie în cazul în care pentru a pune vtable în cazul în care aveți definirea de funcții virtuale a unui obiect repartizate pe mai multe compilatii de unități (de exemplu, unele dintre obiecte virtuale funcții definiții sunt într-o .fișier cpp alții în alta .fișier cpp, și așa mai departe).

Compilatorul alege pentru a pune `vtable în același loc ca și în cazul în care primul a declarat virtuale funcția este definită.

Acum, dacă vă pentru un motiv oarecare a uitat să ofere o definiție pentru prima virtual funcția declarat în obiect (sau din greșeală, a uitat să adauge obiect compilate la conectarea fazei), veți obține această eroare.

Ca un efect secundar, vă rugăm să rețineți că numai pentru acest special funcția virtuale ai câștigat't obține tradiționale linker error ca lipsesc funcția de foo.

 skuntsel
skuntsel
Răspuns editat 11 februarie 2015 в 3:28
11
0
Victor H&#228;ggqvist
Victor Häggqvist
18 august 2014 в 1:24
2014-08-18T01:24:01+00:00
Mai mult
Sursă
Editează
#10608569

Să nu treacă post dar. Dacă ai de-a face cu moștenire cel de-al doilea google lovit a fost ceea ce am avut de pierdut, de exemplu. toate metodele virtuale ar trebui să fie definite.

Cum ar fi:

virtual void fooBar() = 0;

Vezi answare https://stackoverflow.com/q/9406580/1592572 pentru detalii. Doar a dat seama's-a menționat deja mai sus, dar ce naiba te-ar putea ajuta cineva.

8
0
 Sammy
Sammy
23 ianuarie 2017 в 3:20
2017-01-23T15:20:48+00:00
Mai mult
Sursă
Editează
#10608614

Ok, soluția la această este că ți-ai ratat pe definiție. A se vedea exemplul de mai jos, pentru a evita vtable compiler eroare:

// In the CGameModule.h

class CGameModule
{
public:
    CGameModule();
    ~CGameModule();

    virtual void init();
};

// In the CGameModule.cpp

#include "CGameModule.h"

CGameModule::CGameModule()
{

}

CGameModule::~CGameModule()
{

}

void CGameModule::init()    // Add the definition
{

}
8
0
 Stephen
Stephen
17 iunie 2010 в 8:04
2010-06-17T20:04:07+00:00
Mai mult
Sursă
Editează
#10608425
  • Ești sigur că CDasherComponent` are un corp pentru destructor? L's cu siguranta nu aici - întrebarea este dacă este în .cc fișier.
  • Dintr-o perspectivă stil, CDasherModule ar trebui să își definească în mod explicit destructor "virtuale".
  • Se pare ca CGameModule are o } la sfârșit (după }; // pentru clasa).
  • Este CGameModulefiind legate de bibliotecile care definescCDasherModule " și " CDasherComponent`?
7
0
 DevByStarlight
DevByStarlight
16 septembrie 2014 в 8:59
2014-09-16T20:59:57+00:00
Mai mult
Sursă
Editează
#10608574

Poate lipsește virtual destructor este factor?

virtual ~CDasherModule(){};
5
0
 RedSpikeyThing
RedSpikeyThing
5 ianuarie 2017 в 1:46
2017-01-05T13:46:43+00:00
Mai mult
Sursă
Editează
#10608613

Acesta a fost primul rezultat de căutare pentru mine, așa că am crezut că am'd a adăuga un alt lucru pentru a verifica: asigurați-vă că definirea de funcții virtuale sunt de fapt pe clasa. În cazul meu, am avut asa:

Fișier antet:

class A {
 public:
  virtual void foo() = 0;
};

class B : public A {
 public:
  void foo() override;
};

și în a mea .cc fișier:

void foo() {
  ...
}

Acest lucru ar trebui să citiți

void B::foo() {
}
5
0
 JaMiT
JaMiT
15 august 2019 в 2:44
2019-08-15T02:44:00+00:00
Mai mult
Sursă
Editează
#10608618

Ce este un vtable?

Ar putea fi util să știm ce mesaj de eroare este vorba despre înainte de a încerca să-l repara. Am'll începe la un nivel ridicat, atunci munca de jos pentru mai multe detalii. Că modul în care oamenii pot sări înainte, odată ce acestea sunt confortabile, cu înțelegerea lor de vtables. …și acolo se duce o grămadă de oameni sărind peste înainte chiar acum. :) Pentru cei lipirea în apropiere: Un vtable este de fapt cel mai comun punerea în aplicare a polymorphism în C++. Când vtables sunt folosite, fiecare polimorfă clasă are un vtable undeva în program; vă puteți gândi la ea ca un (ascuns) "statice" date membru ale clasei. Fiecare obiect de polimorfe, clasa este asociat cu vtable pentru cele mai multe-clasa derivată. Bifând această asociere, programul poate lucra sale polimorfe magie. Precizare importantă: un vtable este o punere în aplicare detaliu. Nu este mandatat de către C++ standard, chiar dacă cele mai multe (toate?) C++ compilatoare folosesc vtables să pună în aplicare polimorfe de comportament. Detaliile sunt prezentarea sunt fie tipic sau abordări raționale. Compilatoare au voie să se abată de la acest lucru! Fiecare polimorfă obiect are o (ascunse) pointer la vtable pentru obiect's cel mai-clasa derivată (eventual mai multe indicii, în cazuri mai complexe). Uitandu-se la pointer, programul poate spune ce "reală" tip de obiect este (cu excepția în timpul construcției, dar las's sări peste acest caz special). De exemplu, dacă un obiect de tip " A "nu indica vtable de "A", atunci acel obiect este de fapt un sub-obiect de ceva derivat din "A". Numele "vtable" vine de la "virtual funcția masa". Acesta este un tabel care stochează indicii pentru a (virtual) funcții. Un compilator își alege convenția pentru modul în care masa este stabilită; o abordare simplă este de a merge prin funcții virtuale în ordinea în care sunt declarate în clasa definiții. Atunci când un virtual funcție este numit, programul urmează obiect's pointer la un vtable, merge la intrarea asociat cu funcția dorită, apoi foloseste stocate funcția pointer pentru a invoca funcția corectă. Există diverse trucuri pentru a face acest lucru, dar am câștigat't merge în acele aici. În cazul în care/atunci când este o vtable generat?

Un vtable este generat automat (uneori numit "emise"), de către compilator. Un compilator ar putea emite o vtable în fiecare unitate de traducere, care vede o polimorfă clasa definiție, dar care ar fi, de obicei, inutile nejustificată. O alternativă (utilizate de către ccg, și probabil și de alții) este de a alege o singură unitate de traducere în care la locul vtable, similar cu modul în care ar alege un singur fișier sursă în care pentru a pune o clasa' date statice de membri. Dacă acest proces de selecție nu reușește să alege orice traducere de unități, apoi vtable devine un nedefinit de referință. Prin urmare, eroarea, al cărui mesaj este, desigur, deosebit de clar. În mod similar, dacă procesul de selecție se alege o unitate de traducere, dar, ca obiect de fișier nu este prevăzută de linker-ul, apoi vtable devine un nedefinit de referință. Din păcate, mesajul de eroare poate fi chiar mai puțin clară în acest caz decât în cazul în care procesul de selecție nu a reușit. (Datorită respondenti care au menționat această posibilitate. Probabil că m-aș fi uitat în caz contrar.) Procesul de selecție utilizate de către ccg are sens dacă vom începe cu tradiția dedică un (singur) fișier sursă pentru fiecare clasă care are nevoie de una pentru punerea sa în aplicare. Ar fi frumos să emit vtable atunci când compilarea faptul că fișierul sursă. Las's de apel că scopul nostru. Cu toate acestea, procesul de selecție trebuie să lucreze, chiar dacă această tradiție nu este urmat. Deci, în loc de a privi pentru punerea în aplicare a întregii clase, las's uite pentru punerea în aplicare a unui anumit membru al clasei. Dacă tradiția este urmat – și în cazul în care membrul este de fapt implementat – apoi aceasta atinge scopul. Statele selectate de către ccg (și, potențial, de alte compilatoare) este primul non-inline virtual funcție care nu este pur virtual. Dacă faci parte dintre cei care declară constructori și destructori înainte de alte funcții membre, atunci destructorul are o bună șansă de a fi selectate. (Vă amintiți de a face destructor virtual, nu?) Există și excepții; I'd așteptăm ca cele mai frecvente exceptii sunt atunci când o linie definiție este prevăzută pentru destructor și atunci când default destructor este solicitat (folosind "`= default"). Perspicace ar putea observa că un polimorfism clasa este permis pentru a oferi inline definiții pentru toate funcții virtuale. Nu't care determina procesul de selecție pentru a reuși? În vârstă de compilatoare. Am'am citit că cele mai recente compilatoare au abordat această situație, dar nu știu relevante numere de versiune. Am putea încerca să arăți asta, dar's ușor să fie codul în jurul valorii de ea sau să așteptați pentru compilatorul să se plângă. În rezumat, există trei cauze ale "nedefinit de referință pentru vtable" eroare:

  1. O funcție de membru lipsește definiția sa.
  2. Un obiect fișier nu este legat.
  3. Toate funcții virtuale au inline definiții. Aceste cauze sunt prin ele însele suficiente pentru a provoca eroarea pe cont propriu. Mai degrabă, acestea sunt ceea ce s-ar adresa pentru a rezolva eroarea. Nu se așteaptă ca în mod intenționat să creeze una dintre aceste situații cu siguranta va produce această eroare; există alte cerințe. Nu aștepta că rezolvarea acestor situații se va rezolva această eroare. (OK, numarul 3 ar fi fost suficiente, atunci când această întrebare a fost întrebat.) Cum de a stabili eroare?

    Bine ați venit înapoi oameni sărind peste înainte! :)

  4. Uita-te la clasa definiție. Găsi primul non-inline virtual funcție care nu este pur virtual (nu "= 0") și a cărui definiție a vă oferi (nu "`= default").
  • Dacă nu există nici o astfel de funcție, să încerce modificarea clasei astfel încât nu există unul. (Eroare, eventual rezolvate.)
  • A se vedea, de asemenea, răspunsul de Philip Thomas pentru un avertisment.
  1. Găsi o definiție pentru această funcție. Dacă acesta lipsește, adăugați-l! (Eroare, eventual rezolvate.)
  • A se vedea, de asemenea, răspunsul de RedSpikeyThing pentru un avertisment.
  1. Verifica-ti link-ul de comanda. Dacă nu se menționează obiectul fișier cu funcția's definiție, fix asta! (Eroare, eventual rezolvate.)
  2. Repetați pașii 2 și 3 pentru fiecare virtual funcție, atunci pentru fiecare non-virtual funcție, până când eroarea este rezolvată. Daca're încă blocat, se repetă pentru fiecare datelor statice membru. Exemplu Detaliile a ceea ce să facă, poate varia, și, uneori, se ramifică în diferite întrebări (ca Ce este un nedefinit de referință/nerezolvate simbol extern de eroare si cum pot remedia it?). Voi, însă, să ofere un exemplu de ceea ce să facă într-un caz specific, care ar putea ameți mai noi programatori. Pasul 1 menționează modificarea clasă, astfel încât ea are o funcție de un anumit tip. Dacă descrierea de această funcție a trecut peste cap, s-ar putea fi în situația în care intenționez să le abordez. Păstrați în minte că acest lucru este un mod de a realiza obiectivul; ea nu este singura cale, și acolo cu ușurință ar putea fi mai bine modurile în situația dvs. specifice. Las's sun clasa "A". Este destructor declarate (în definiția de clasă), fie ca
virtual ~A() = default;

sau

virtual ~A() {}

? Dacă este așa, două etape va schimba destructor în tipul de funcție ne-o dorim. În primul rând, schimba linia de

virtual ~A();

Al doilea, a pus următoarea linie într-un fișier sursă care este parte a proiectului dumneavoastră (de preferință fisierul cu clasa de punere în aplicare, dacă aveți unul):

A::~A() {}

Care face (virtual) destructor non-inline și nu generat de compilator. (Simțiți-vă liber pentru a modifica lucrurile pentru a se potrivi mai bine codul de formatare stil, cum ar fi adăugarea unui antet comentariu la definirea funcției.)

GCC Frequently Asked Questions - GNU Project
gcc.gnu.org
3
0
 Bretzelus
Bretzelus
4 noiembrie 2014 в 4:28
2014-11-04T16:28:35+00:00
Mai mult
Sursă
Editează
#10608578

Nu poate. Cu siguranta ~CDasherModule() {} lipsește.

3
0
Nathan Daniels
Nathan Daniels
10 noiembrie 2016 в 2:59
2016-11-10T02:59:31+00:00
Mai mult
Sursă
Editează
#10608611

Atât de multe răspunsuri, dar niciunul dintre ei nu părea să fi acoperite care este problema mea. Am avut urmatoarele:


class I {
    virtual void Foo()=0;
};

Și într-un alt fișier (inclus în elaborarea și leagă, desigur)

class C : public I{
    void Foo() {
        //bar
    }
};

Ei bine acest lucru nu't de lucru si am primit eroarea toată lumea vorbește despre. Pentru a rezolva aceasta, am avut pentru a muta definiția actuală a Foo din declarația de clasă ca atare:

class C : public I{
    void Foo();
};

C::Foo(){
   //bar
}

Am'm C++ guru deci nu pot't explica de ce acest lucru este mult mai corectă, dar a rezolvat problema pentru mine.

3
0
Daniel Georgiev
Daniel Georgiev
18 decembrie 2016 в 2:29
2016-12-18T02:29:32+00:00
Mai mult
Sursă
Editează
#10608612

Așa că am fost folosind Qt cu Windows XP și MinGW compiler și acest lucru a fost de conducere mine nebun.

Practic moc_xxx.cpp a fost generat de gol chiar și atunci când I-a fost adăugat

Q_OBJECT

Ștergerea tot ceea funcții virtuale, explicite și orice ai ghici nici't a lucrat. În cele din urmă am început eliminarea linie cu linie și s-a dovedit că am avut

#ifdef something

În jurul valorii de fișier. Chiar și atunci când #ifdef fost adevărata fișierul nu a fost generat.

Deci eliminarea tuturor #ifdefs rezolvat problema.

Acest lucru nu se întâmplă cu Windows și VS 2013.

3
0
Jerry Miller
Jerry Miller
15 august 2014 в 2:57
2014-08-15T14:57:47+00:00
Mai mult
Sursă
Editează
#10608564

Dacă toate altceva nu reușește, uita-te pentru duplicare. Am fost îndrumat greșit de explicit trimitere inițială la constructori și destructori până când am citit-o referință la un alt post. L's any nerezolvate metodă. În cazul meu, am crezut că am avut înlocuit cu declarația pe care a folosit char xml ca parametru cu o utilizează în mod inutil supărătoare const char xml, dar în loc de asta, am creat unul nou și a lăsat-o pe cealaltă în loc.

2
0
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
工藤 芳則
Înregistrat 6 zile în urmă
2
Ирина Беляева
Înregistrat 1 săptămână în urmă
3
Darya Arsenyeva
Înregistrat 1 săptămână în urmă
4
anyta nuam-nuam (LapuSiK)
Înregistrat 1 săptămână în urmă
5
Shuhratjon Imomkulov
Înregistrat 1 săptămână în urmă
BG
DA
DE
EL
ES
FR
ID
IT
JA
KO
LT
NL
NO
PT
RO
RU
SK
SL
TR
ZH
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire