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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
#1

Абстракция в С++ - C++

25.09.2012, 15:04. Просмотров 988. Ответов 16
Метки нет (Все метки)

Не думал , что столько проблем возникнет с этим на С++ , куда проще все это и на Delphi и в Java, но хватит нытья суть вопроса вот у меня есть абстрактный класс
C++
1
2
3
4
5
6
class OperationBehavior{
    public:
    char * type;
    OperationBehavior(){type="base behavior";};
    virtual TMMatrix calc(TMMatrix* matrx_1,TMMatrix* matrx_2){};//может я зря реализовал его пустным
};
и его наследник
C++
1
2
3
4
5
class Addition : public  OperationBehavior{
    public:
    Addition(){if(type) type="add behavior";};
    TMMatrix calc(TMMatrix* matrx_1,TMMatrix* matrx_2);
};
еще есть класс посредник так называемый калькулятор
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class CalculatorMatrix{
    private:
    OperationBehavior operation;
    public:
    CalculatorMatrix(OperationBehavior *ob);
    void setOperationBehavior(OperationBehavior *ob);
    TMMatrix calc(TMMatrix* matrx_1,TMMatrix* matrx_2);
 
};
 
CalculatorMatrix::CalculatorMatrix(OperationBehavior* ob){
        operation=*ob;//определение типа вычисления
    }
 
TMMatrix CalculatorMatrix::calc(TMMatrix* matrx_1,TMMatrix* matrx_2){
     if (&operation!=NULL) {
         return operation.calc(matrx_1,matrx_2);//вызов вычисления и тут косяк!
     }
    }
пытаюсь вызвать calc() наследника
C++
1
2
3
   OperationBehavior *ob=new Addition();
   CalculatorMatrix cm=CalculatorMatrix(ob);
   m3=cm.clac(m1,m2);//m1 m2 m3 типа TMMatrix
и не получается у меня вызвать операцию именно моего наследника, я хочу сделать это именно таким образом, напрямую все понятное дело работает, я не понимаю почему при передаче указателя внутри calc() калькулятора уже рушится все и вызывается calc() родителя
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2012, 15:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Абстракция в С++ (C++):

Абстракция - C++
Мужики, объясните пожалуйста термин "Абстракция" в С++ на примере более понятно. а то в вики научно описано без примеров.

абстракция - C++
оъясните,пжлста,на примере суть абстракции

Абстракция классов - C++
Всем утра доброго ;) Люди знающие и люди опытные подскажите вот такую вещь: как планировать правильно иерархию классов, что бы только...

Наследование и абстракция - C++
Где ошибка? На всякий все классы кинул. >d:\UserName\программирование\с++\проекты...

Абстракция текста [C++] - C++
Написал программу которая представляет собой абстракцию текста с классом контейнером. Писал в VS 2008 professional, при компиляции выдает 4...

Абстракция вызова функции - C++
Итак я хотел бы обсудить с участниками форума такую задачу. Но перед тем как перейти к сути - замечу, что вопросы морально-этического...

16
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.09.2012, 15:10 #2
Nixy, Указатель или ссылку храните на тип OperationBehaviour в классе CalculatorMatrix
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 15:12  [ТС] #3
ForEveR, так вот она
C++
1
OperationBehavior operation;
дебагером прохожу и вижу что
C++
1
2
3
4
5
TMMatrix CalculatorMatrix::calc(TMMatrix* matrx_1,TMMatrix* matrx_2){
     if (&operation!=NULL) {
         return operation.calc(matrx_1,matrx_2);//вызов вычисления и тут косяк!
     }
    }
тут еще мой предок Addition , но потом вызывается метод родителя
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.09.2012, 15:19 #4
Nixy, Это не ссылка. Это значение. Разные вещи, не находите?
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 15:30  [ТС] #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Nixy, Это не ссылка. Это значение. Разные вещи, не находите?
шас попробую, привык с Delphi ,там равнозначно вроде было

Добавлено через 1 минуту
ForEveR, огромное спасибо, а вы не знаете почему передавая сам объект ссылка на него не тянется?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.09.2012, 15:38 #6
Nixy, Всмысле? Объект есть объект.
C++
1
OperationBehavior operation;
operation теперь имеет тип OperationBehavior. Только этот тип и никакой другой. При вызове call вызовется функция именно этого класса, ибо ни о каком позднем связывании объекты знать не знают.

C++
1
2
3
CalculatorMatrix::CalculatorMatrix(OperationBehavior* ob){
        operation=*ob;//определение типа вычисления
    }
Вызывает оператор присваивания для operation.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 15:43  [ТС] #7
ForEveR, В Делфях объкект все время был с сылкой на самого себя, вот и мне интересно почему в С++ не так )= и еще не до конца понятно, почему если я передал по ссылке объект, не работает , а если соглосовал ссылки на один и тот же объект то работает

и еще один вопрос если можно) я так понял если класс абстрактный, то там происходит перегрузка оператора присвоения ,чем это грозит, и как это лучше использовать
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.09.2012, 15:47 #8
Nixy, Языки разные, только и всего. В шарпе к примеру есть два типа объектов value_type и reference_type, все что является классом является reference_type, все что является структурой - value_type. В С++ экземпляры классов/структур являются объектами, если не указано иного.
я так понял если класс абстрактный, то там происходит перегрузка оператора присвоения ,чем это грозит, и как это лучше использовать
Формулируйте вопросы точнее. Вопрос не понятен абсолютно.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.09.2012, 15:48 #9
А разве на джаве это вообще возможно?
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
25.09.2012, 15:56 #10
Почему то ни кто не сказал, что ни какого абстракного класса здесь нет. Это обычный класс с виртуальной функцией.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 15:57  [ТС] #11
Цитата Сообщение от taras atavin Посмотреть сообщение
А разве на джаве это вообще возможно?
конкретней что ?

to ForEveR я заметил , что у класса OperationBehavior после того как я его сделал обстрактным, ввел virtual функцию, появилась функция operator = я в книге видел , что это называется перегрузка оператора , или я путаю ?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.09.2012, 16:00 #12
taras atavin, Указатели нет. А так конечно, в чем проблема.

Java
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
import java.lang.*;
 
class base
{
   public void foo() { System.out.println("base::foo"); }
};
 
class derived extends base
{
   @Override
   public void foo() { System.out.println("derived::foo"); }
};
 
class calculator
{
   base reference;
   public calculator(base ref)
   {
      reference = ref;
   }
   public void execute() { reference.foo(); }
};
 
public class test
{
    public static void main( String[] args )
    {
       calculator calc = new calculator(new derived());
       calc.execute();
    }
}
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 16:00  [ТС] #13
Цитата Сообщение от Kastaneda Посмотреть сообщение
Почему то ни кто не сказал, что ни какого абстракного класса здесь нет. Это обычный класс с виртуальной функцией.
ну я где-то увидел ,что класс с virtual функцией назвали абстрактным, то ли на форуме тут , то ли в книге
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.09.2012, 16:02 #14
Nixy, Ввод виртуальной функции не делает класс абстрактным. Оператор = неявно генерируется компилятором, в том случае, если не описан user-defined оператор присваивания (ну и некоторые другие случаи, в данном контексте не имеющие значения).
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 16:03  [ТС] #15
ForEveR, вот , за это Java и нравится, интуитивно все понятно, я бы врятли сам додумался о том ,чтоб объект ссылкой заменить

Добавлено через 40 секунд
ForEveR, тогда скажите как мне явно сделать класс абстрактным , как в Java например
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2012, 16:03
Привет! Вот еще темы с ответами:

Класс-контейнер(абстракция текста) - C++
Необходимо создать класс-контейнер, который является абстракцией текста. Если я правильно понял, то мне необходимо создать класс...

Абстракция данных и решение задач на C++ ? - C++
Как понять Абстракция данных и решение задач на C++ ? void sendRequest(Request request) { if (server->error() !=...

Абстракция данных...модули определяющие типы - C++
//--------------------------------------------------------------------------- #pragma hdrstop #include <tchar.h> #include...

Абстракция данных. Как реализовать, на примере класса 2D векторов - C++
Собственно, я пытался разделить код методов и их объявления. Сам класс в файле Vector.h, а код методов в Vector.cpp. Когда весь код...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
25.09.2012, 16:03
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru