LInked ошибка, undefined reference to 'vtable for фигура'

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;

class figura{
   protected: 
    string nombre;
    int lados;
   public:
    virtual int area();    

};

class cuadrado:public figura{

    public:
        cuadrado(){
        lados=4;
    }
    virtual int area(){
    return lados*lados;
    }
};

class triangulo:public figura{
    int a,b;
    public:
        triangulo(){
        lados=3;
    }
    void pedir(){
    cout<<"Base: "<<endl;
    cin>>b;
    cout<<"Altura: "<<endl;
    cin>>a;
    }
    virtual int area(){
    return ((b*a)/(2));
    }
};



main(){
    int op;
    int *punt;
    int v;
    cout<<"FIGURAS"<<endl;
    cout<<"1. Cuadrado\n2. Triangulo"<<endl;
    cin>>op;
    if(op==1){
        cuadrado ob1;
        v=ob1.area();
        punt=&v;
    }
    else{
        triangulo ob1;
        ob1.pedir();
        ob1.area();
    }
    system("pause");
}
2
задан 20.03.2019, 03:20
2 ответа

Твоя проблема estГЎ aquГ-:

class figura {
...
public:
  virtual int area( );
};

Ты Заявляешь твой funciГіn-член как virtual, но у тебя нет тело ее funciГіn, ты ни объявил как виртуальные чистые .

у составителя, когда находит одну funciГіn-член virtual, есть свобода, чтобы осуществлять в Ваш вкус ; она mayorГ - в (из-за того, что они не говорят все) они используют mecanimo, VPTR + VTABLE .

Давайте Говорить, что состоит из aГ±adir указатель скрытые в твой класс, который содержит ее direcciГіn виртуальных функций той же самой; serГ - во что-то asГ-:

// El compilador general algo como esto

class figura;

struct figuraVTABLE {
  int ( *area )( figura *this );
};

class figura {
  struct figuraVTABLE *VPTR;
  ...
  // Las cosas reales de tu clase ...
  ...
};

Это механизм скрытые и прозрачные для tГ-; не необходимо, чтобы ты обработал информацию с этим. Составитель берется за это без того, чтобы tГє у тебя не было даже, что знать это.

AdemГЎs предыдущего, C ++ работает с единицами traducciГіn индивида: estГЎ позволенный объявлять вещи в файле и осуществлять в другом. Это мотив существования файлов заголовка , и, что она generaciГіn выполнимого осуществился в 2 шагах: compilaciГіn + , соединенные .

Вї Проблема всего этого? Так как, которые ты можешь признавать вещами в сайте, и забывать давать им стоимость..., что то, что ты estГЎ происходя.

, Когда funciГіn-член заявляет как virtual, составитель aГ±ade переменная в твой класс, но он не распределяет ему ningГєn стоимость ; это редактор связей, который берется за это. И уже мы знаем, что эта стоимость может быть в другой единица traducciГіn .

Это твоя проблема: VPTR твоего класса он не соответствует ни одной VTABLE.

у Тебя Есть 2 решения:

  1. Объявляет твой funciГіn-член как чистые :

    class figura {
    ...
    public:
      virtual int area( ) = 0; // <- AQUÍ
    };
    

    С этим, уже estГЎs инициализируя ты VPTR. Ты сообщаешь, что эта у funciГіn-члена нет тела . Твой класс переходит к тому, чтобы быть абстрактными , с которым ты не можешь объявлять изменчивые инстанции этого класса:

    figura mifigura1; // <-- ERROR.
    
  2. Осуществляет твой funciГіn-член; помести ему тело . Это может делаться в отдельном файле, и что потом редактор связей взялся:

    // firgura.cpp
    int figura::area( ) {
    ...
    }
    

    Или ты можешь делать все в том же файле:

    class figura {
    ...
    public:
      virtual int area( ) {
        ...
      }
    };
    

Замечает : это объявляет твой funciГіn-член как inline, что отдельная история..., но уже мы распространяемся слишком много.

В твоем конкретном случае, я думаю, что она soluciГіn, который ты ищешь, является 1: превращать твой класс в абстрактный класс .

Замечает : Твоя проблема - одна variaciГіn SГ-mbolo приходящий ученик, не решая. Вї QuГ© я повредил?

2
ответ дан 02.12.2019, 05:24

Вся твоя проблема может сводиться к следующему cГіdigo:

struct B
{
    virtual void f();
};

struct D : B
{};

int main()
{
    D{}.f();
    return 0;
}

Полная ошибка serГ - в:

undefined reference to `B::f()'
In function `B::B()':
undefined reference to `vtable for B'
undefined reference to `B::f()'

ясный и автообъяснительный, но я это перевожу для того, чтобы он это был aГєn mГЎs:

referencia a `B::f()' no definida
En la función `B::B()':
referencia a `vtable for B' no definida
referencia a `B::f()' no definida

Ошибка сказал нам три раза что она funciГіn f из B не estГЎ определенная, и верно, estГЎ sГіlo объявленная, asГ - что для того, чтобы ошибка исчезла, ты должен определять ее funciГіn area из figura:

class figura {
protected: 
    string nombre;
    int lados;
public:
    virtual int area() { return {}; }
};

, Но ввиду того, что каждая из производных фигур они идут в sobrescribir она funciГіn area, он не имеет смысл, что Г©sta у него был definiciГіn, podrГ-туз избегать определять haciГ©ndola виртуальные чистые :

class figura {
protected: 
    string nombre;
    int lados;
public:
    virtual int area() = 0;
};

Эта soluciГіn, ademГЎs имения преимущества в том, чтобы не писать cГіdigo, что он не имеет смысл, что он был написан, вынуждает тебя определять ее funciГіn в производных классах и вызывает ошибку compilaciГіn в случае, если ты это забудет быть сделанным.

1
ответ дан 02.12.2019, 05:24