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

Класс с добавлением функций - C++

Восстановить пароль Регистрация
 
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 88
01.07.2015, 15:38     Класс с добавлением функций #1
День добрый!

Возникла вот какая нужда. Есть объекты одного класса, взаимодействие этих объектов обычно происходит одинаково, но возможно что с тем или иным обёктом нужно взаимодействовать по особому. Эта функция для взаимодействия будет уникальна только для одного объекта.

Вопрос, можно ли как-то добавить функцию к какому-то объекту или может быть привязать к нему ссылку на функцию что ли.

Заранее спасибо за ответы!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
01.07.2015, 15:42     Класс с добавлением функций #2
Судя по описанию, это работа для виртуальных функций.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
01.07.2015, 15:43     Класс с добавлением функций #3
А простое наследование - разве не то, что надо?
C++
1
2
3
4
5
6
7
class A
{
};
class B:public A
{
   void SpecialMetod();
};
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.07.2015, 15:45     Класс с добавлением функций #4
а оно тебе зачем? Если что-то происходит по-особому, то это по-любому объект не того же класса.
Можешь, поконкретнее описать ситуацию, что это за объекты такие странные?
В общем случае, можно посоветовать использовать указатель на функцию, но такое решение оно вообще к ООП слабо относится.

Добавлено через 1 минуту
zss, наследоваться может класс, а не объект. Тебе придётся писать целый новый класс, который может иметь множество экземпляров, для этого "особого" поведения. А речь про объекты.
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 88
01.07.2015, 15:51  [ТС]     Класс с добавлением функций #5
Если конкретнее, то скажем есть у меня три системы координат. Две из них абсолютно одинаковы и отличаются лишь ориентацией осей. Связь между ними простая. А третья - абсолютно другая. И связь с ней происходит совсем подругому.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
01.07.2015, 18:50     Класс с добавлением функций #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
class DescartesLeft { // Левосторонние декартовы координаты
public:
    DescartesLeft(double X, double Y, double Z): x(X), y(Y), z(Z) {} // Задание напрямую
    double x, y, z;  // Данные надо бы прятать в private, но тут можно и так
};
 
class DescartesRight {  // Правосторонние декартовы координаты
public:
    DescartesRight(double X, double Y, double Z): x(X), y(Y), z(Z) {}  // Задание напрямую
    DescartesRight(const DescartesLeft& dl): x(dl.x), y(dl.y), z(-dl.z) {}  // Преобразуем из левосторонних координат, меняя знак по оси Z
    operator DescartesLeft() const {return DescartesLeft(x, y, -z);}  // Преобразование в левосторонние координаты
    double x, y, z;
};
 
class Sperical {// Сферические координаты
public:
    Spherical(double Phi, double Lambda, double R): phi(Phi), lambda(Lambda), r(R) {}  // Задание напрямую
    Spherical(const DescartesLeft& dl);  // преобразование из левосторонних декартовых, математику опускаю
    Spherical(const DescartesRight& dr);  // в C++11 можно преобразовать аргумент в DescartesLeft и перекинуть в предыдущий конструктор
    operator DescartesLeft() const  // Преобразование в левосторонние декартовы
    {   // Реализуем хотя бы это преобразование, для примера
        return DescartesLeft(
            r * cos(phi) * cos(lambda),
            r * sin(phi),
            r * cos(phi) * sin(lambda)
        );
    }
    operator DescartesRight() const;  // Преобразование в правосторонние декартовы
    double phi, lambda, r;  // широта, долгота, расстояние
};
 
// Использование
void foo(const DescartesLeft& coords);
 
void bar()
{
    DescartesLeft dl(1, 2, 3);
    foo(dl);  // Используем значение напрямую
    Spherical s(0.7, 3.14, 42);
    foo(s);  // Из сферических координат создаются левосторонние декартовы и перекидываются в foo
    DescartesRight dr = s;  // И так можно
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2015, 19:50     Класс с добавлением функций
Еще ссылки по теме:

A+B=C из файла с добавлением 0 dev c++ 4.9.9.2 C++
C++ Перегрузка функций (Создать класс Set )
Функции работы со строками, отличие функций с добавлением _s C++

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

Или воспользуйтесь поиском по форуму:
Fallenworld
75 / 75 / 9
Регистрация: 14.04.2014
Сообщений: 408
01.07.2015, 19:50     Класс с добавлением функций #7
надо делать базовый класс координат с виртуальными функциями, которые мастхев(даже не знаю какие)
а в наследниках уже переопределять их.
тогда можно будет пилить методы типа
setChoordSystem(const ChoordSystem& cs);

сами данные всетаки лучше убрать в приват, а доступ к ним дать через методы.
тогда можно будет получать любую координату из любой системы, и при этом ничего не сломать.

как я понял ТС хочет зделать связанные системы координат. Тогда надо в каждой еще указатель на товарища(или контейнер с указателями)
Yandex
Объявления
01.07.2015, 19:50     Класс с добавлением функций
Ответ Создать тему
Опции темы

Текущее время: 01:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru