Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виртуальные функции 
:(
    Опции темы
FantomaS19
Дата 26.8.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 28.7.2007

Репутация: нет
Всего: нет



Код

#include "stdafx.h"
#include <iostream>

class Cd
{
private:
    char performers[50];
    char label[20];
    int selections; // кол-во сборников
    double playtime; // время воспроизведения в минутах
public:
    Cd(char * s1, char * s2, int n, double x);
    Cd(const Cd & d);
    Cd();
    ~Cd();
    virtual void Report() const; // отображает все данные диска
    Cd & operator=(const Cd & d);
};

class Classic : public Cd
{
private:
    char vedu [50];
public:
    Classic(char * vedu, char * s1, char * s2, int n, double x);
    Classic(const Cd &, char * vedu);
    Classic();
    ~Classic();
    virtual void Report() const;
    Classic & operator=(const Classic & d);
};

/*Cd::Cd(char * s1, char * s2, int n, double x)
{
    strncpy(performers, s1, 49);
    performers[49] = '\0';
}*/

int main()
{
    return 0;
}


Если убрать комментарии /* */ , то появляется ошибка 
unresolved external symbol "public: virtual void __thiscall Cd::Report(void)const " (?Report@Cd@@UBEXXZ)
Как конструктор связан с виртуальными функциями? smile 
PM MAIL   Вверх
zkv
Дата 26.8.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(FantomaS19 @  26.8.2007,  14:51 Найти цитируемый пост)
Как конструктор связан с виртуальными функциями?

хочет указатель на нее получить видимо (для таблицы виртуальных методов)
если тебе не нужна реализация метода в базовом классе, то объяви его абстрактным (чистым виртуальным):
Код

class Cd
{
...
  virtual void Report() const=0;
...
};

Класс, кстати, тоже станет абстрактным.
PM MAIL   Вверх
Xenon
Дата 26.8.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Ну у тебя виртуальная функция не определена smile она тогда должна быть вообще чисто виртуальной. Если добавишь пустое тело к функции, то все заработает.
Код

class Cd
{
private:
    char performers[50];
    char label[20];
    int selections; // кол-во сборников
    double playtime; // время воспроизведения в минутах
public:
    Cd(char * s1, char * s2, int n, double x);
    Cd(const Cd & d);
    Cd();
    ~Cd();
    virtual void Report() const {}  // отображает все данные диска
    Cd & operator=(const Cd & d);
};

class Classic : public Cd
{
private:
    char vedu [50];
public:
    Classic(char * vedu, char * s1, char * s2, int n, double x);
    Classic(const Cd &, char * vedu);
    Classic();
    ~Classic();
    virtual void Report() const {}
    Classic & operator=(const Classic & d);
};

/*Cd::Cd(char * s1, char * s2, int n, double x)
{
    strncpy(performers, s1, 49);
    performers[49] = '\0';
}*/


Добавлено через 22 секунды
Опередили smile


--------------------
user posted image  
PM MAIL   Вверх
zkv
Дата 26.8.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Xenon @  26.8.2007,  15:12 Найти цитируемый пост)
Если добавишь пустое тело к функции, то все заработает.

думаю, что это идеологически неверный подход  smile 
PM MAIL   Вверх
FantomaS19
Дата 26.8.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 28.7.2007

Репутация: нет
Всего: нет



Спасибо, 
Цитата

то объяви его абстрактным   

Я бы так сделал, но надо создавть объекты базового класса.
PM MAIL   Вверх
Xenon
Дата 26.8.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



zkv, ну просто :
Цитата

Я бы так сделал, но надо создавть объекты базового класса.


smile


--------------------
user posted image  
PM MAIL   Вверх
Любитель
Дата 26.8.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(FantomaS19 @  26.8.2007,  15:45 Найти цитируемый пост)
Я бы так сделал, но надо создавть объекты базового класса.

Цитата(zkv @  26.8.2007,  15:19 Найти цитируемый пост)
думаю, что это идеологически неверный подход  



--------------------
PM MAIL ICQ Skype   Вверх
FantomaS19
Дата 27.8.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 28.7.2007

Репутация: нет
Всего: нет



Надо переделать прогу в первом сообщении под использование динамических массивов.
Вот:
Код

#include "stdafx.h"
#include <iostream>

class Cd
{
private:
    char * performers;
    char * label;
    int selections; // кол-во сборников
    double playtime; // время воспроизведения в минутах
public:
    Cd(char * s1, char * s2, int n, double x);
    Cd(const Cd & d);
    Cd();
    virtual ~Cd();
    virtual void Report() const ; // отображает все данные диска
    Cd & operator=(const Cd & d);
};

class Classic : public Cd
{
private:
    char * veduchii; // дополнительная строка
public:
    Classic(char * vedu, char * s1, char * s2, int n, double x);
    Classic(const Classic & b);
    Classic();
    virtual ~Classic();
    virtual void Report() const;
    Classic & operator=(const Classic & d);
};

Cd::Cd(char * s1, char * s2, int n, double x)
{
    performers = new char [strlen(s1) + 1];
    strcpy(performers, s1);
    label = new char [strlen(s2) + 1];
    strcpy(label, s2);
    selections = n;
    playtime = x;
}
Cd::Cd(const Cd & d)
{
    this->selections = d.selections;
    this->playtime = d.playtime;
    performers = new char [strlen(d.performers) + 1];
    strcpy(performers, d.performers);
    label = new char [strlen(d.label) + 1];
    strcpy(label, d.label);
}
Cd::Cd() 
{
    performers = new char [1];
    label = new char [1];
}
Cd::~Cd()
{
    delete [] performers;
    delete [] label;
}
void Cd::Report() const
{
    std::cout << "Performers: " << performers << std::endl;
    std::cout << "Label: " << label << std::endl;
    std::cout << "Selections: " << selections << std::endl;
    std::cout << "Playtime: " << playtime << std::endl;
}
Cd & Cd::operator=(const Cd & d)
{
    if (this == & d)
        return *this;
    else
    {
        delete [] performers;
        delete [] label;
        this->selections = d.selections;
        this->playtime = d.playtime;
        strcpy(performers, d.performers);
        strcpy(label, d.label);
        return *this;
    }
}
// реализация производного класса
Classic::Classic(char * vedu, char * s1, char * s2, int n, double x) : 
Cd(s1, s2, n, x)
{
    veduchii = new char [strlen(vedu) + 1];
    strcpy(veduchii, vedu);
}
Classic::Classic(const Classic & b) : Cd(b)
{
    veduchii = new char [strlen(b.veduchii) + 1];
    strcpy(veduchii, b.veduchii);
}
Classic::Classic() : Cd()
{
    veduchii = new char [1];
}
Classic::~Classic()
{
    delete [] veduchii;
}
void Classic::Report() const
{
    Cd::Report();
    std::cout << "Veduchii: " << veduchii << std::endl;
}
Classic & Classic::operator=(const Classic & d)
{
    veduchii = new char [strlen(d.veduchii) + 1];
    strcpy(veduchii, d.veduchii);
    Cd::operator=(d);
    return *this;
}

void Bravo(const Cd & disk);
using namespace std;
int main()
{
    Cd c1("Beatles", "Capitol", 14, 35.5);
    Classic c2 = Classic("Piano Sonata in B flat, Fantasia in C", 
        "alfred Brendel", "Philips", 2, 57.17);
    
    cout << "Testing assignment: " << endl;
    Classic copy;
    copy = c2;
    cout << endl;
    copy.Report();

    return 0;
}

void Bravo(const Cd & disk)
{
    disk.Report();
}


Появляется ошибка исполнения.Может я где-то дважды delete или еще что сделал? smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4157 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.