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

Создать копию объекта производного класса зная указатель на базовый - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Перевод программы на С++ с Паскаля http://www.cyberforum.ru/cpp-beginners/thread424970.html
var sn,s:string; l,k,kod:integer; v,p:real; begin writeln('Введите строку'); readln(s); l:=length(s); p:=1; k:=1; repeat sn:='';
C++ Абстрактный класс вот у меня есть классы: class CCommand { public: virtual ~CCommand() {}; virtual void execute(CShape *selection)=0; virtual void unexecute()=0; virtual CCommand* clone()=0; }; http://www.cyberforum.ru/cpp-beginners/thread424964.html
Задачник по C/C++ C++
Здравствуйте! Ребята, может кто посоветует хорошую книгу с задачами, и желательно с решениями к ним по С/С++ ? Буду очень благодарен!;)
C++ Возведение в степень по модулю для чисел близких к max long long
Даны числа A,B,C<=2^63-1 Надо посчитать A^B mod С. прошу не выкладывать стандартный алгоритм для Int, так как неверный ответ в итоге получается.
C++ как определить число в строке? http://www.cyberforum.ru/cpp-beginners/thread424953.html
У меня по задаче сказанно ввести строку и найти произведение входящих в строку чисел, не могу понять как определить числа, поскольку интернет весь облазил и полезного мало.
C++ Все та же ошибка error C2447 Всем привет!При компиляции,компилятор высвечивает мне "error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)", в 17-ой строчке.Я по учебнику попытался написать программу с использованием аргументов переменных функции main,но в итоге не знаю как исправить эту ошибку.Буду благодарен за помощь! Код: #include "stdafx.h" #include <iostream> using... подробнее

Показать сообщение отдельно
Ilshat89
0 / 0 / 0
Регистрация: 29.08.2009
Сообщений: 12
08.05.2012, 22:37     Создать копию объекта производного класса зная указатель на базовый
Столкнулся с такой же проблемой. Решил вот так:

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
class Base
{
public:
    virtual Base* clone() { return this; }
    virtual ~Base() {}
};
 
class Der1: public Base
{
    char c;
public:
    Der1(): c('m') {}
};
class Der2: public Base
{
    int n;
public:
    Der2(): n(682) {}
};
 
std::vector<Base*> list;
void func(Base *b) {
    Base *ptr = new Base(*b);
    ptr = b->clone();
    list.push_back(ptr);
}
 
int main()
{
    Der1 d;
    Der2 dd;
    func(&d);
    func(&dd);
 
    system("PAUSE");
    return 0;
}
В итоге, в векторе list будут указатели на иниц-ые объекты производных классов. Если что, clone можно переопределить в производных.

Добавлено через 3 часа 21 минуту
Цитата Сообщение от Ilshat89 Посмотреть сообщение
Столкнулся с такой же проблемой. Решил вот так:

C++
1
class Base...
В итоге, в векторе list будут указатели на иниц-ые объекты производных классов. Если что, clone можно переопределить в производных.
Извиняюсь, неправильно написал код, вот верный вариант:
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
49
50
51
52
53
54
55
56
class Base
{
public:
    virtual Base* clone() { return 0; }
    virtual ~Base() {}
};
 
class Der1: public Base
{
    char c;
 
public:
    Der1(): c('m') {}
    
    char& getc() { return c; }
 
    virtual Base* clone() {
        Der1 *p = new Der1;
        p->c = c;
        return p;
    }
};
class Der2: public Base
{
    int n;
public:
    Der2(): n(682) {}
 
    virtual Base* clone() {
        Der2 *p = new Der2;
        p->n = n;
        return p;
    }
};
 
std::vector<Base*> vvv;
void func(Base *b) {
    Base *ptr = b->clone();
    vvv.push_back(ptr);
}
 
int main()
{
    Node n1, n2, n3;
    Manager::ModifyNode(&n2);
    Manager::undoLast();
 
    Der1 d; //d.c = 'm';
    Der2 dd; //dd.n = 546;
    func(&d);
    func(&dd);
    d.getc() = 'a';
 
    system("PAUSE");
    return 0;
}
В первом варианте указатели в списке указывали на переданные объекты d и dd, а также глупо "утекала" память в функции func() В этом коде уже указатели указывают на новые объекты в памяти (копии d и dd). Строка d.getc() = 'a'; изменяет только объект d, а копия остается нетронутой.
 
Текущее время: 21:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru