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

Как обратится к обьекту класса, являющегося наследником абстрактного класса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Линейный поиск в массиве структуры http://www.cyberforum.ru/cpp-beginners/thread1508038.html
Нужно с помощью линейного поиска искать в готовом массиве структуры значение вводимое с клавиатуры. Напишите шаблон , по которому это можно реализовать. Спасибо.
C++ Windows боксы (Окна, формы) Приветствую уважаемые пользователи cyberforum! Сразу не знаю как правильно называется это. Но как можно реализовать окна на Windows? http://www.cyberforum.ru/cpp-beginners/thread1508019.html
C++ Не могу осознать причину ошибки
Ну, в общем, читаю, такой, Страуструпа и прогаю малеху его примеры. Вот реализация одного из них: #include<iostream> char * strcpy1(char * dst, const char * src){ while (*dst++ = *src++) ; return dst; } int main()
Строка string. Не присваивается новое значение C++
Есть строка: string str_in = "A"; Она используется в созданной мной функцией как один из аргументов: fuction(arg1,arg2,str_in,arg4); Внутри функции значение строки меняется: char sim; //string m;
C++ Наследование методов http://www.cyberforum.ru/cpp-beginners/thread1507978.html
Может мне стоит книжку почитать или получше подумать над структурой, но вопрос вот: Есть у нас древо классов: base > s2 > s3 > s4 > ... И есть в base virtual void f(){ _act1_ } А в s2 virtual void f(){ _act2_ } А в s3 должен обратно быть метод base::virtual void f(){ _act1_ } И чтобы s4 также использовал base::virtual void f(){ _act1_ } Т.е. переопределение виртуального должно работать...
C++ Класс Singletone Здравствуйте! Продолжаю готовиться к экзамену по С++. На последнем уроке вкратце рассказали про класс Singleton, но я расслабился и слушал невнимательно, так как урок был последний. Одним словом, посоветуйте хороший источник, где рассказывается про класс Singletone, где легко и понятно объясняется, от простого к сложному, с примерами на С++ на каждом этапе. Желательно на русском языке. ... подробнее

Показать сообщение отдельно
hoggy
5114 / 2115 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
01.08.2015, 18:52     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Цитата Сообщение от Avazart Посмотреть сообщение
Да я код читаю, из него ничего не понять что вы хотели продемонстировать... пример фиг знает чего, ради не знаю чего.
там в обоих случаях дизайн принципиально не отличается.
различие лишь в незначительных технических деталях:

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
#include <iostream>
#include <memory>
 
// --- найдите 10 принципиальных отличий
 
class Base {};
 
 
class C1 : public Base
{
public:
    static std::unique_ptr<C1> create()
    {
        std::unique_ptr<C1> x(new C1);
        x->v = 10;
        return x;
    }
    
private:
    C1() {}
    int v;
};
 
class C2 : public Base
{
public:
    friend std::unique_ptr<C2> create();
   
private:
    C2() {}
    
    int v;
};
std::unique_ptr<C2> create()
{
    std::unique_ptr<C2> x(new C2);
    x->v = 10;
    return x;
}
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    // --- смотреть на дизайн использования:
    auto obj1 = C1::create();
    auto obj2 = create();
}
в обоих случаях, создание объекта в обход фабрики запрещен.
в обоих случаях, в качестве фабрики использованы свободные функции.
в обоих случаях они - часть интерфейса класса

единственная разница в том,
что статическая-функция член существует в пространстве имени своего класса

а функция друг - вне пространства имени класса.

никаких других отличий в данном случае нет вообще.

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

недаром, что функцию член можно определить прямо в теле декларации класса:

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
#include <iostream>
#include <memory>
 
// --- найдите 10 принципиальных отличий
 
class Base {};
 
 
class C1 : public Base
{
public:
    static std::unique_ptr<C1> create()
    {
        std::unique_ptr<C1> x(new C1);
        x->v = 10;
        return x;
    }
    
private:
    C1() {}
    int v;
};
 
class C2 : public Base
{
public:
    friend std::unique_ptr<C2> create()
    {
        std::unique_ptr<C2> x(new C2);
        x->v = 10;
        return x;
    }
 
   
private:
    C2() {}
    
    int v;
};
std::unique_ptr<C2> create();
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    // --- смотреть на дизайн использования:
    
    auto obj1 = C1::create();
    
    auto obj2 = create();
    
}

однако поскольку, часто френдами злоупотребляют,
сливая потроха кому ни поподя,
нарушая инкапсуляцию,
и превращая таким образом код в лапшу,
то это и породило миф якобы о том,
что френды - зло, и нарушают инкапсуляцию.

Добавлено через 39 минут
Цитата Сообщение от Avazart Посмотреть сообщение
тогда насколько понятен этот код? И можно его улучшить/переписать/сделать понятнее?
да вроде все понятно:
есть 3 штуки элементов,
связка которых определяет модель данных.

и есть манагер, в который вынесена вся логика организации связей.

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

с точки зрения архитектуры - вполне себе нормальны ход.

однако, я противник подобного дизайна:
C++
1
2
3
4
5
6
7
    Graph g;
    Vertex* v1= g.addVertex();
    Vertex* v2= g.addVertex();
 
    Edge* e= g.addEdge(v1,v2); //<--- закатали указатель
 
    delete v1; //ой, а чего это мы тут прибили ненароком?
C++
1
2
3
4
5
6
7
8
9
Edge *DependencyManager::createEdge(Graph *graph, Vertex *from, Vertex *to)
{
   assert(graph && from!=to && graph==from->graph_ && graph==to->graph_);
   Edge* edge= new Edge(graph,from,to);
   graph->edges_.push_back(edge);
   from->outEdges_.push_back(edge);   //<--- вах! вах!!! 
   to->inEdges_.push_back(edge);
   return edge;
}
нарушение правила:
кто захватывал, тот и должен освобождать.

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

C++
1
2
3
4
5
    
    Graph g;
    Vertex& v1= g.addVertex();
    Vertex& v2= g.addVertex();
    g.addEdge(v1,v2);
 
Текущее время: 00:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru