неопределенная ссылка на 'vtable for' - PullRequest
0 голосов
/ 26 декабря 2018

Так что это часть большого проекта.У меня есть 3 разных файла.Первый - это класс из предыдущего проекта, который просто используется как тип (visitor.h), поэтому я не буду его включать, поскольку знаю, что он работает.Затем я написал абстрактный класс и другой абстрактный класс, который наследуется от первого в space.h, вот так:

class space{

public:
    virtual int get_vis_count() const = 0;
    virtual int __enter(Visitor *v) = 0;
    virtual int search(Visitor *v) = 0;
    virtual Visitor* __exit(int index) = 0;
    virtual void print() const = 0;
    virtual ~space() { };

};

class capped_space: public space{

    public:
    virtual int get_capacity() const = 0;
    virtual int has_space() const = 0;
};

Теперь в моем classes.hi есть несколько классов и ошибка:

classes.o: In function `office::office(building*, int, int)':
classes.cpp:(.text+0x8fe): undefined reference to `vtable for office'
classes.o: In function `office::~office()':
 classes.cpp:(.text+0xe1a): undefined reference to `vtable for  office'

СОЗ.classes.h:

class office:public capped_space{

private:
int office_number, No;
int  current_visitors;
int _f;
vector<Visitor*> visitors;

public:
office(building *b, int on, int m);
int get_capacity() const;
int has_space() const;
int get_vis_count() const;
int get_numb() const;
int __enter(Visitor * visitor);
int search(Visitor *v);
Visitor* __exit(int index);
Visitor* done();
void print() const;
~office();
};

classes.cpp:

office::office(building *b, int on, int m): office_number(on),  current_visitors(0), _f(m){
  No = b->get_space_size('o');
  cout << "Office number: " << office_number << "\thas been created\n";
}

int office::get_vis_count() const{
  return current_visitors;
}

int office::has_space() const{
  return (current_visitors < No);
}

int office::get_numb() const{
  return office_number;
}

int office::__enter(Visitor * visitor){
  if(visitor == NULL) return -1;
  if(has_space()){
    if(!visitor->__done()){
        if((visitor->get_office() == office_number)){
            visitors.push_back(visitor);
            cout << "Entering office " << _f << "-" << office_number << "\t: ";
            visitors[current_visitors]->print_v();
            current_visitors++;
            return 1;
        }else{
            return 0;
        }
    }else{
        return 1;
    }
}else{
    cout << "Please, wait outside for entrance in office number: " <<   office_number << endl;
    return 0;
  }
}

Visitor* office::__exit(int index){
  if (visitors[index]->__done()){
    Visitor *nav;
    nav = visitors[index];
    visitors.erase(visitors.begin() + index);
    current_visitors--;
    return nav;
  }else{
    return NULL;
  }
}

Visitor* office::done(){
  if(current_visitors){
    int random;
    random = rand() % current_visitors;
    visitors[random]->__set_done();
    cout << "Exiting office " << _f << "-" << office_number << "\t: ";
    visitors[random]->print_v();
    return __exit(random);
  }else{
    return NULL;
  }
}

void office::print() const{
    if(current_visitors != 0){
      cout << "Floor: " << _f << endl;
      cout << "Office: " << office_number << endl;
      for (int i = 0; i < No; i++)
      {
        visitors[i]->print_v();
      }
      cout << endl;
}
} 

office::~office(){
    cout << "End of the work!\n";
 }

Вторая ошибка появляется в функциях класса, но я надеюсь, что если я обнаружу офисную ошибку, я также выяснюfloor.

Если вам понадобится еще какой-нибудь код, пожалуйста, прокомментируйте, и я отредактирую.

PS, пожалуйста, не обращайте внимания на некоторые вопросы, которые я мог оставить позади.Изначально код обрабатывал массивы указателей, и теперь я пытаюсь заставить его обрабатывать векторы указателей, чтобы могли быть некоторые оставшиеся проверки

1 Ответ

0 голосов
/ 26 декабря 2018

Вам не хватает определений для некоторых виртуальных методов, которые вы объявили в office, а именно search и get_capacity.

В результате компилятор не может создать виртуальныйтаблица функций для класса office, потому что у нее нет адресов для размещения этих виртуальных функций.Следовательно, «очень полезное» сообщение об ошибке, потому что, с точки зрения компилятора, проблема в том, что виртуальная таблица отсутствует, а не , почему она отсутствует.

...