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

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

Восстановить пароль Регистрация
 
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 15:04     Абстракция в С++ #1
Не думал , что столько проблем возникнет с этим на С++ , куда проще все это и на 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() родителя
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.09.2012, 15:10     Абстракция в С++ #2
Nixy, Указатель или ссылку храните на тип OperationBehaviour в классе CalculatorMatrix
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 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 , но потом вызывается метод родителя
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.09.2012, 15:19     Абстракция в С++ #4
Nixy, Это не ссылка. Это значение. Разные вещи, не находите?
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 15:30  [ТС]     Абстракция в С++ #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Nixy, Это не ссылка. Это значение. Разные вещи, не находите?
шас попробую, привык с Delphi ,там равнозначно вроде было

Добавлено через 1 минуту
ForEveR, огромное спасибо, а вы не знаете почему передавая сам объект ссылка на него не тянется?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 15:43  [ТС]     Абстракция в С++ #7
ForEveR, В Делфях объкект все время был с сылкой на самого себя, вот и мне интересно почему в С++ не так )= и еще не до конца понятно, почему если я передал по ссылке объект, не работает , а если соглосовал ссылки на один и тот же объект то работает

и еще один вопрос если можно) я так понял если класс абстрактный, то там происходит перегрузка оператора присвоения ,чем это грозит, и как это лучше использовать
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.09.2012, 15:47     Абстракция в С++ #8
Nixy, Языки разные, только и всего. В шарпе к примеру есть два типа объектов value_type и reference_type, все что является классом является reference_type, все что является структурой - value_type. В С++ экземпляры классов/структур являются объектами, если не указано иного.
я так понял если класс абстрактный, то там происходит перегрузка оператора присвоения ,чем это грозит, и как это лучше использовать
Формулируйте вопросы точнее. Вопрос не понятен абсолютно.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.09.2012, 15:48     Абстракция в С++ #9
А разве на джаве это вообще возможно?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
25.09.2012, 15:56     Абстракция в С++ #10
Почему то ни кто не сказал, что ни какого абстракного класса здесь нет. Это обычный класс с виртуальной функцией.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 15:57  [ТС]     Абстракция в С++ #11
Цитата Сообщение от taras atavin Посмотреть сообщение
А разве на джаве это вообще возможно?
конкретней что ?

to ForEveR я заметил , что у класса OperationBehavior после того как я его сделал обстрактным, ввел virtual функцию, появилась функция operator = я в книге видел , что это называется перегрузка оператора , или я путаю ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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();
    }
}
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 16:00  [ТС]     Абстракция в С++ #13
Цитата Сообщение от Kastaneda Посмотреть сообщение
Почему то ни кто не сказал, что ни какого абстракного класса здесь нет. Это обычный класс с виртуальной функцией.
ну я где-то увидел ,что класс с virtual функцией назвали абстрактным, то ли на форуме тут , то ли в книге
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.09.2012, 16:02     Абстракция в С++ #14
Nixy, Ввод виртуальной функции не делает класс абстрактным. Оператор = неявно генерируется компилятором, в том случае, если не описан user-defined оператор присваивания (ну и некоторые другие случаи, в данном контексте не имеющие значения).
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 16:03  [ТС]     Абстракция в С++ #15
ForEveR, вот , за это Java и нравится, интуитивно все понятно, я бы врятли сам додумался о том ,чтоб объект ссылкой заменить

Добавлено через 40 секунд
ForEveR, тогда скажите как мне явно сделать класс абстрактным , как в Java например
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.09.2012, 16:03     Абстракция в С++ #16
Nixy, В ява для этого нужно написать abstract насколько я помню. В С++ должна быть как минимум одна чисто виртуальная функция.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2012, 16:06     Абстракция в С++
Еще ссылки по теме:

абстракция C++
C++ Абстракция вызова функции
C++ Абстракция классов

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

Или воспользуйтесь поиском по форуму:
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
25.09.2012, 16:06  [ТС]     Абстракция в С++ #17
Цитата Сообщение от ForEveR Посмотреть сообщение
Nixy, В ява для этого нужно написать abstract насколько я помню. В С++ должна быть как минимум одна чисто виртуальная функция.
да все верно, я просто невнимательно прочитал раздел про чисто виртуальные функции на С++, спасибо
да и сразу отпадает вопрос про указатель на абстрактный класс
Yandex
Объявления
25.09.2012, 16:06     Абстракция в С++
Ответ Создать тему
Опции темы

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