Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
1

Программирование на интерфейсах

24.03.2016, 20:50. Показов 919. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как в С++ программируют на интерфейсах?
Предположим, имеется иерархия типов: Интерфейс -> Абстрактный класс -> Конкретный класс
По смыслу эта иерархия связанна логически, специфичные методы описываются в конкретной реализации

Интерфейс
C++
1
2
3
4
5
6
class UserInterface
{
    virtual void setName(std::string name) = 0;
    virtual std::string getName() const = 0;
    virtual void doSomething() = 0;
};
Абстрактный класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class AbstractUser : public UserInterface
{
private:
    std::string name;
public:
    virtual void setName(std::string name) override
    {
        this->name = name;
    }
    virtual std::string getName() const override
    {
        return this->name;
    }
    virtual void doSomething() = 0;
};
Конкретная реализация
C++
1
2
3
4
5
6
7
class User : public AbstractUser
{
    virtual void doSomething() override
    {
        std::cout << "Do something called!";
    }
};
Мне нужно использовать в качестве типа интерфейс. Например, при создании экземпляра или передачи экземпляра в метод в качестве параметра как показано ниже
C++
1
2
3
4
5
6
7
8
9
10
11
class Account
{
private:
    std::string user;
public:
    Account(UserInterface user)
    {
        this->user = user;
    }
    //some implementation...
};
При попытке создать экземпляр с типом интерфейса компилятор выдает ошибку
C++
1
UserInterface user;//Ошибка. Абстрактный тип не может быть использован
Тоже самое происходит и в типах метода.
Подскажите пожалуйста, как можно решить этот вопрос?

Добавлено через 6 минут
В классе Account вместо std::string тип должен быть UserInterface, не успел отредактировать
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2016, 20:50
Ответы с готовыми решениями:

Проблема с программным нажатием кнопок тулбара в новых интерфейсах
Есть задача: Нажать программно кнопку в интерфейсе чужой программы находящейся на тулбаре....

Обобщения в интерфейсах
Доброй ночи. Что-то не могу сообразить простенькую задачку, подскажите пожалуйста. Есть несколько...

Переменные в интерфейсах
Не компилиться, в чём может быть ошибка? Ругается на константы. package peremennueVinterfeisah;...

ООП, интерфейсах и наследовании
Имеется визуальный элемент, который позволяет просматривать и модифицировать данные. Визуальный ...

4
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
24.03.2016, 21:30 2
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Используйте указатель на интерфейс:
C++
1
2
3
UserInterface* user = new User();
user->setName("bob");
user->doSomething();
И не забывайте про виртуальные деструкторы.
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
24.03.2016, 21:55  [ТС] 3
mishelle92,
Ух ты! Спасибо!

Цитата Сообщение от mishelle92 Посмотреть сообщение
И не забывайте про виртуальные деструкторы.
Обязательно.

А так User user; user.setName("bob");Account account(user); никак нельзя несмотря на то что среди предков User есть UserInterface?
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
24.03.2016, 22:18 4
Цитата Сообщение от sys_beginner Посмотреть сообщение
А так User user; user.setName("bob");Account account(user); никак нельзя несмотря на то что среди предков User есть UserInterface?
Можно. Ведь User не является абстрактным классом, а значит создавать экземпляры этого класса не запрещено.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Account
{
private:
    UserInterface *user;
public:
    Account(UserInterface* user)
    {
        this->user = user;
    }
    //some implementation...
};
 
User user;
user.setName("bob");
 
Account account(&user);
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
24.03.2016, 22:38  [ТС] 5
mishelle92,
Спасибо! Не додумался сразу использовать адрес
0
24.03.2016, 22:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2016, 22:38
Помогаю со студенческими работами здесь

Важны ли типы в интерфейсах
Прав ли я, что без разницы? Смотрите: в интерфейсе в методе - void, а в классе - string; в...

Статические методы в интерфейсах
Не могу понять, что не так. Есть у меня интерфейс, в котором есть описание статического метода,...

Объявление методов в интерфейсах
Добрый вечер! Требуется в интерфейсе создать метод, чтобы после реализации этого интерфейса неким...

Давайте пофантазируем об интерфейсах
За предпосылку примем очки добавленной реальности, чьи стёкла совмещают функцию носимых дисплеев...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru