0 / 0 / 0
Регистрация: 16.11.2014
Сообщений: 41
1

Создать универсальный вектор для разных типов класса

29.11.2014, 13:14. Показов 3612. Ответов 7
Метки нет (Все метки)

Нужно создать абстрактный класс, в котором будет метод Add(), типа вектор, но этот метод должен использоваться в трех классах наследниках, которые должны будут вернуть вектор типа своего класса. Можно ли как-то сделать метод Add() универсальным для всех наследников?

C++
1
2
3
4
5
class AbstractClass
{
public:
    virtual vector<?????> Add() = 0;
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2014, 13:14
Ответы с готовыми решениями:

Создать метод типа вектор, для разных типов вектора
Нужно создать абстрактный класс, в котором будет метод Add(), типа вектор, но этот метод должен...

Перегрузка оператора для разных типов данных шаблонного класса
Создаю оператор инкремента. Как создать отдельный оператор инкремента для каждого типа объекта...

Как можно создать общий класс для разных типов?
как можно создать общий класс для разных типов переменной name (Int32, Double, DateTime,...

Как создать список для объектов разных типов данных
Здравствуйте, подскажите, пожалуйста, у меня есть задание: Создать базовый класс «Транспорт» и...

7
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
29.11.2014, 17:20 2
либо
C++
1
2
3
4
5
class AbstractClass
{
public:
    virtual AbstractClass Add() = 0;
};
либо

C++
1
2
3
4
5
template<typename T>class AbstractClass
{
public:
    virtual vector<T> Add() = 0;
};
полиморфизма между templateClass<base> и templateClass<derived> нету.
0
0 / 0 / 0
Регистрация: 16.11.2014
Сообщений: 41
29.11.2014, 17:50  [ТС] 3
Спасибо огромное)))

Добавлено через 9 минут
к сожалению, ни один из вариантов не работает, выдает такие ошибки:

error C2143: синтаксическая ошибка: отсутствие ";" перед "<"
error C2433: AbstractClass<T>::vector: 'virtual' не разрешается для объявлений данных
error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
error C2238: непредвиденные лексемы перед ";"

подскажите, пожалуйста, что не так делаю?

в классе наследнике,использую 2ой вариант стоит что-то менять?
пробовала вот так
C++
1
class Players: public AbstractClass<Players>
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
29.11.2014, 18:04 4
Sasha_Pav, Поделитесь всем кодом.
0
0 / 0 / 0
Регистрация: 16.11.2014
Сообщений: 41
29.11.2014, 18:07  [ТС] 5
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
#pragma once
#include <vector>
 
template<typename T> class AbstractClass
{
public:
    virtual vector<T>  Add() = 0;
    virtual void Change() = 0;
};
 
 
#pragma once
#include "AbstractClass.h"
#include "Player.h"
#include <vector>
 
class Players: public AbstractClass
{
private:
    vector<Player> myplayer;
 
public:
    Players();
 
    vector<Player> Add(Player);
    vector<Player> Delete(int);
    vector<Player> Change(int, int, string, double);
 
    ~Players();
};
Добавлено через 46 секунд
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
#pragma once
#include "AbstractClass.h"
#include "Game.h"
#include <vector>
 
class Games : public AbstractClass 
{
private:
    vector<Game> mygame;
 
    vector<Game> won_games;
    vector<Game> lost_games;
    vector<Game> drawn_games;
    vector<Game> not_played_games;
    vector<Game> sorted_by_date_games;
 
public:
    Games();
 
    vector<Game> Add(Game);
    vector<Game> Delete(int);
    vector<Game> Change(int, int, string, int, int);
    void ShowAllGames(vector<Game> &, int, int, int, int);
 
    vector<Game> get_Won_games() const {return won_games;}
    vector<Game> get_Lost_games() const {return lost_games;}
    vector<Game> get_Drawn_games() const {return drawn_games;}
    vector<Game> get_Not_played_games() const {return not_played_games;}
    vector<Game> get_Sorted_by_date_games() const {return sorted_by_date_games;}
 
 
    ~Games();
};
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
29.11.2014, 18:34 6
Смотрите ниже, возможную реализацию, но стоит отметить что это избыточный код, который стоит использовать либо в библиотеках всяческих, либо при оптимизациях в особенно тонких местах.

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
57
58
59
60
61
62
63
64
65
66
class Player
{
 
};
 
template<typename T> class AbstractClass
{
public:
    virtual std::vector<T>& Add(T& value) = 0;
    virtual void Change(int, int, std::string, double) = 0;
};
 
namespace AbstractClassUtils
{
    template<typename T>
    std::vector<T> Add(AbstractClass<T>& abstract, T value)
    {
        return abstract.Add(value);
    }
}
 
 
template<typename T>
class Players : public AbstractClass<T>
{
private:
    std::vector<T> myplayer;
 
public:
    Players() {};
 
    std::vector<T>& Add(T& value)
    {
        return myplayer;
    }
 
    std::vector<T> Delete(int)
    {
    }
 
    void Change(int, int, std::string, double)
    {
    }
 
    ~Players() {}
};
 
class Player2
{
 
};
 
 
int main()
{
    Players<Player*> *pl = new Players<Player*>();
    Players<Player2*> *pl2 = new Players<Player2*>();
 
    std::vector<Player*> vec1 = AbstractClassUtils::Add(*pl, new Player());
    std::vector<Player2*> vec2 = AbstractClassUtils::Add(*pl2, new Player2());
    AbstractClass<Player2*> *pl22 = pl2;
    AbstractClass<Player2*> *pl21 = pl; // ошибка, полиморфизма нет.
 
    system("pause");
    return 0;
}
И ответьте на вопрос, какие операции через AbstractClass вы желаете производить с Games и Players, в частности зачем вам возвращаемый вектор?
0
0 / 0 / 0
Регистрация: 16.11.2014
Сообщений: 41
29.11.2014, 18:45  [ТС] 7
через AbstractClass, с наследниками надо будет производить операции добавления, изменения и удаления. Преподаватель сказала, что желательно из методов возвращать вектор, хотя наверное стоит попробовать использовать обычный void.
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
29.11.2014, 19:03 8
Либо делать так:
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
class AbstractClass
{
public:
    virtual std::vector<AbstractClass*>& Add(AbstractClass* value) = 0;
    virtual void Change(int, int, std::string, double) = 0;
};
 
 
class Players : public AbstractClass
{
private:
    std::vector<AbstractClass*> myplayer;
 
public:
    Players() {};
 
    std::vector<AbstractClass*>& Add(AbstractClass* value)
    {
        myplayer.push_back(value);
        return myplayer;
    }
 
    void Change(int, int, std::string, double)
    {
    }
 
    ~Players() {}
};
Но это обычный недоделанный компоновщик с которым работать нужно либо напрямую используя RTTI, либо писать обёртки.
В общем, то что вы желаете делать, так просто не сделать
О чём говорил преподаватель, я не знаю.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2014, 19:03
Помогаю со студенческими работами здесь

Создать массивы разных типов(3 типов), вывести их на экран
Создать массивы разных типов(3 типов), вывести их на экран.

Как создать общий список с разных типов данных для 2 потомков?
Есть базовый абстрактный класс и 2 потомка. Как создать общий список с разных типов данных для 2...

Двумерный вектор из разных типов - возможно?
Добрый вечер. ага, как вечер, так начинаются походы по сказочным лесам :D Возник такой вопрос...

Можно ли создать свой перегруженный вариант функций, для разных типов потока
Доброго времени суток. Хотелось бы задать несколько вопросов, ответы на которые мне не удалось...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru