我的代码中的C ++未定义引用错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的代码中的C ++未定义引用错误?相关的知识,希望对你有一定的参考价值。

我的代码块编译器向我的代码提供了“对vtable Plant的未定义引用错误”,我已经阅读了本页中的其他文章,但是并没有解决我的问题。我尝试添加虚拟和普通析构函数。请查看我的代码,并尝试使用cpp11在Code :: Blocks中运行它,并且本主题不再重复!这是我的代码:

#include <iostream>    
#include <vector>
#include <cstdlib>
#include <fstream>
#include <vector>
#include <time.h>

#include "Plant.h"



using namespace std;

int main()



            vector<Plant*> novenyek;
            int novenyszam = 5;
            f >> novenyszam;
            novenyek.resize(novenyszam);
          //  novenyek[i].push_back(new Deltafa("a",0,true)); //thhis does not work 
            for (int i=0; i<novenyszam; i++)
               /* string tempname;
                string tempfajta;
                string temptapanyag;
            */
              //  string a = "Falank";
     // novenyek[i] =  new Puffancs(a,7,true);

      novenyek[i] = new Deltafa("a",0,true);

              //new Puffancs("Falank",7,true);

        //novenyek.push_back(new Puffancs("a",7,true));
//      novenyek[i] = new Plant(Puffancs("nev",7,true));

           //  novenyek.push_back();

            
    return 0;

Plant.h

#pragma once
#include <string>
#include <ostream>
#include <stdlib.h>


enum Sugarzas

    ALFA,
    DELTA,
    NONE,
;

struct SugarzasIgeny

    Sugarzas _sugarzas;
    int _mennyiseg;
    SugarzasIgeny(Sugarzas sugarzas, int mennyiseg = 0): _mennyiseg(mennyiseg), _sugarzas(sugarzas) 

;

class Plant

public:
    ///Plant(const std::string &nev, int tapanyag, bool El_e) : _nev(nev), _tapanyag(tapanyag), _El_e(El_e) 


        std::string nev() const  return _nev; 
        int tapanyag() const  return _tapanyag; 
        bool El_e() const  return _El_e; 

        // Sablonfuggveny
        virtual SugarzasIgeny nap(Sugarzas sugarzas);
      ~Plant () 
protected:


    std::string _nev; //noveny neve
    int _tapanyag;    //tapanyaga
    bool _El_e;       //ele

    Plant(const std::string &nev, int tapanyag, bool El_e) : _nev(nev), _tapanyag(tapanyag), _El_e(El_e) 
;


class Puffancs : public Plant

public:
    Puffancs(const std::string &nev, int tapanyag, bool El_e) : Plant(nev, tapanyag, El_e) 
    virtual  SugarzasIgeny nap(Sugarzas sugarzas) ;
;

class Deltafa : public Plant

public:
    Deltafa(const std::string &nev, int tapanyag, bool El_e) : Plant(nev, tapanyag, El_e) 
    virtual  SugarzasIgeny nap(Sugarzas sugarzas) ;
;

class Parabokor : public Plant

public:
    Parabokor(const std::string &nev, int tapanyag, bool El_e) : Plant(nev, tapanyag, El_e) 
    virtual SugarzasIgeny nap(Sugarzas sugarzas) ;
;

Plant.cpp

#include "Plant.h"

SugarzasIgeny Puffancs::nap(Sugarzas sugarzas)


    switch (sugarzas)
    
    case Sugarzas::ALFA :
        _tapanyag += 2;
        break;
    case Sugarzas::DELTA :
        _tapanyag -= 2;
        break;
    case Sugarzas::NONE :
        _tapanyag -= 1;
        break;
    default:
        break;
    

    if ( _tapanyag > 0 && _tapanyag <=10)
         _El_e = false;
    else 
        _El_e = true;
    


    return SugarzasIgeny(Sugarzas::ALFA, 10);


SugarzasIgeny Deltafa::nap(Sugarzas sugarzas)

    switch (sugarzas)
    
    case Sugarzas::ALFA :
        _tapanyag -= 3;
        break;
    case Sugarzas::DELTA :
        _tapanyag += 4;
        break;
    case Sugarzas::NONE :
        _tapanyag -= 1;
        break;
    default:
        break;
    
    if (_tapanyag > 0)
        _El_e = true;
    else _El_e = false; 

    if (_tapanyag <5 )
        return SugarzasIgeny(Sugarzas::DELTA, 4);
    
    else if (_tapanyag >= 5 && _tapanyag <= 10 )
        return SugarzasIgeny(Sugarzas::DELTA, 1);
    else 
         return SugarzasIgeny(Sugarzas::NONE, 10);
    



SugarzasIgeny Parabokor::nap(Sugarzas sugarzas)

    switch (sugarzas)
    
    case Sugarzas::ALFA :
        _tapanyag++;
        break;
    case Sugarzas::DELTA :
        _tapanyag++;
        break;
    case Sugarzas::NONE :
        _tapanyag--;
        break;
    default:
        break;
    
   // _El_e = tapanyag > 0;

    if (_tapanyag > 0)_El_e = true;
    else _El_e = false;

    return SugarzasIgeny(Sugarzas::NONE, 10);

答案

只需定义Plant::nap

class Plant 
public:
    ...
    // Probably stupid code, but just for example
    virtual SugarzasIgeny nap(Sugarzas sugarzas)  return SugarzasIgeny(Sugarzas::ALFA); 
...
;

或使其成为纯虚拟的:

class Plant 
public:
    ...
    // Pure virtual, no need for code, but class is then non instanciable
    virtual SugarzasIgeny nap(Sugarzas sugarzas)=0;
...
;

以上是关于我的代码中的C ++未定义引用错误?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式 C/C++:现有符号的未定义引用

我收到“未定义的引用”错误,我不明白为啥(C++ OO)

编译具有相同标头的 C 和 C++ 文件时未定义的引用

WebStorm中的“未定义步骤引用”在尝试时引用TypeScript步骤定义代码

未定义对“strlwr”的引用

链接错误:Armadillo 库中的“未定义对‘pthread_atfork’的引用”