Форум программистов, компьютерный форум CyberForum.ru

[linker error] undefined reference to 'vtable for Car' - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как осуществить Обработку бинарного файла? http://www.cyberforum.ru/cpp-beginners/thread86150.html
Файл содержит произвольные данные. Определить, встречается ли в файле определенная последовательность байт (заданных виде массива символов). Если встречается, то вывести на экран все смещения, где эта последовательность встречается.
C++ Магический квадрат Всем привет! Вот во вторник экзамен по программированию, препод дала задачки разобрать пять штук, для подготоки, помогите если не сложно. 1. Написать функцию, которая выводит на экран строку, состоящую из звёздочек. Длина строки (количество звёздочек) является параметром функции. Составить программу, использующую эту функцию для рисования равностороннего треугольника. 2. Написать программу,... http://www.cyberforum.ru/cpp-beginners/thread86127.html
C++ Вывести на экран в первой строке нечетные символы, во второй четные символы исходной строки
Помогите написать 3 программы. (на С или С++) 1. Вывести на экран в первой строке нечетные символы, во второй четные символы исходной строки. 2. Вывести на экран сначала цифры, затем буквы, затем остальные символы исходной строки. 3. В исходном массиве все элементы, встречающиеся больше одного раза заменить на нули. Добавлено через 19 часов 50 минут Ап теме, плиз...
C++ поменять местами 2 соседних слова в строке
как написать эту программу? ввести массив строк слова разделены 1 пробелом, максимальная размерность массива 10 строк по 50 элементов поменять местами каждые 2 соседних слова в каждой строке
C++ Расчетная Работа с Файлами.Удаление записи. http://www.cyberforum.ru/cpp-beginners/thread86068.html
Возникли проблемы с удалением записи из структуры.Подскажите где у меня ошибка почему не видет? // Console.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <iostream> #include <conio.h> #include <string.h> #include<stdlib.h>
C++ Система обмена сообщениями Здраствуйте форумчане! И так мне надо написать клиент-серверное сетевое приложение реализующее функционал системы обмена сообщениями (аськи на пример). нужен программа-сервер и клиент. И все это дело надо написать на C++ под Linux. Есть проблемма, дело в том, что я никогда не писал такие программы, да и вообщем новичек в этом деле (и щас проходу стажировку). Абсолютно не знаю с чего начать и как... подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
16.01.2010, 12:49     [linker error] undefined reference to 'vtable for Car'
Цитата Сообщение от jemper Посмотреть сообщение
вообще не понимаю, что это слово "vtable" означает и откуда оно взялось
В отличие от Си, язык Си++ является высокоуровневым. Т.е. ты пишешь в исходнике чего-то, а в процессе построения кода компилятор дополнительно рожает ещё целую кучу кода. В данном случае компилятор строит дополнительные таблицы виртуальных функций (слово vtable берётся оттуда)

Цитата Сообщение от jemper Посмотреть сообщение
да самому разобраться нужно.. но и к институту имеет отношение
Я просто спросил к тому, что у тебя классы концептуально неправильно реализованы. Вообще для классов есть понятия "свойство" и "метод". Свойство - это то, что можно хранить в виде данных. Например, если есть класс "фигура круг", то "радиус" - это свойство, ибо его можно хранить в виде данных. А вот "нарисовать" это уже метод, поскольку он требует каких-то действий и его нельзя хранить в виде данных (в нормальном случае)

В твоём случае название машины выполнено в виде метода, хотя это данное в чистом виде. Идеологически правильным было бы сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
 
class Car 
{ 
private:
  // Название машины. Модификатор const по сути дела означает то, что
  // это поле можно изменить только при создании объекта в конструкторе,
  // после чего это поле модифицировать уже нельзя. Название машины - это
  // такая вещь, которая даётся машине один раз и уже не меняется.
  // Модификатор const дополнительно спасёт нас от внутренних ошибок
  // и при попытке изменить это поле компилятор выругается
  std::string const m_Name;
 
public: 
  // В конструкторе записываем название
  Car (const std::string &name) : m_Name (name) { }
 
  // Метод getName НЕ должен быть виртуальным, т.к. всё разнообразие
  // наследников класса будет записывать имя машины в поле m_Name,
  // при этом метод остаётся единым для всех. Т.е. различие идёт НЕ
  // в реализации метода, а в хранении данных
  const std::string& getName() const { return m_Name; }
};
 
class CarBMW : public Car
{
public:
  // Из нашего конструктора вызываем конструктор базового класса, чтобы
  // задать ему свойство m_Name
  CarBMW () : Car ("BMW") { }
};
 
class CarAudi : public Car
{
public:
  // Аналогично
  CarAudi () : Car ("Audi") { }
};
 
int
main (void)
{
  CarBMW car1;
  CarAudi car2;
 
  std::cout << car1.getName() << endl;
  std::cout << car2.getName() << endl;
}
Колёса должны быть такими же данными. Но в случае с колёсами ситуация немного другая. За время жизни колёса могут меняться (но название остаётся одним и тем же). Поэтому колёса должны быть выполнены так, чтобы их можно было заменять

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Car
{
  ...
private:
  Wheel *m_W1, *m_W2, *m_W3, *m_W4;
public:
  setWheels (Wheel *w1, Wheel *w2, Wheel *w3, Wheel *w4)
  {
    m_W1 = w1;
    m_W2 = w2;
    m_W3 = w3;
    m_W4 = w4;
  }
  getWheel1 () { return m_W1; }
  getWheel2 () { return m_W2; }
  getWheel3 () { return m_W3; }
  getWheel4 () { return m_W4; }
}
В итоге в конечном счёте получается, что на данном уровне тебе виртуальные функции не нужны

Добавлено через 2 минуты
Да, использование string'ов вместо char*, использование модификаторов const, передаче параметров по ссылке (через &) может тебе показаться несколько непонятным. В приницпе, можно переписать и без этого, но если нужно для себя, то лучше приучай себя сразу к тому, что делать по-человечески
 
Текущее время: 07:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru