Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2011, 20:58   #1
WarHamster
Пользователь
 
Регистрация: 09.08.2010
Сообщений: 48
По умолчанию Копирование классов

Описываю классом структуру Вирта - представление графа системой указателей. Как описать грамотное присваивание одного обьекта другому? Я попытался перегрузить присваивание, но как-то бесуспешно:
Код:
struct Leader;
typedef Leader* LRef;
struct Trailer;
typedef Trailer* TRef;

struct Leader // Заголовочный узел
{
int key; // Имя заголовочного узла
LRef next; // Указатель на след. узел в списке заголовочных узлов
TRef trail; // Указатель на список смежности, сод. последователей
int x,y; // Позиция в декартовых координатах
int number; // Порядковый номер вершины
bool inflood; // Флаг - вершина задействована в текущем потоке
bool span; // Вершина в остовном дереве
};

struct Trailer // Дуговой узел
{
LRef id; // Указатель на связанный заголовочный узел
TRef next; // Указатель на следующий дуговой узел
unsigned int weight; // Вес ребра
unsigned int flowin, flowout; // Пропускная способность потока
bool span; // Ребро в остовном дереве
bool euler; // Ребро в цикле эйлера
};

class VirtGraph
{
public:
        LRef Head; // Начало списка заголовочных узлов
        LRef Tail; // Фиктивный элемент в конце списка заголовочных узлов
        LRef SearchGraph(int);
        LRef Search(int);
        TRef SearchRib(int, int);
        int SearchKey( int );
        bool mode; // true - ориентированный, false - неориентированный
        bool showweight; //true - показать вес ребер
        bool showfloods; //true - показать потоки
        Modes printmode;
        VirtGraph(): mode(false), showweight(false), showfloods(false), printmode(graph) { Head=Tail=new(Leader); }
        ~VirtGraph();
        void CreateGraph();
        void DestroyGraph();
        void AddGraph(int, int, int, int, int);
        void DeleteGraph(int, int);
        void DeleteY(int y);
        void Free1Graph(LRef, LRef);
        void Free2Graph(TRef);
        int HeadCount();
        void SetCoordinates();
        void Print(TCanvas*);

        VirtGraph operator=(VirtGraph Old)
        {
        VirtGraph temp;
        temp.Euler=Old.Euler;
        temp.mode=Old.mode;
        temp.printmode=Old.printmode;
        temp.showweight=Old.showweight;
        temp.showfloods=Old.showfloods;
        LRef p=Old.Head;
        TRef q;
        while(p!=Old.Tail)
                {
                q=(*p).trail;
                while(q!=NULL)
                        {
                        temp.AddGraph( (*p).key, (*(*q).id).key, (*q).weight, (*q).flowout, (*q).flowin );
                        }; //Добавляю каждую дугу по отдельности
                };         //Фактически собираю граф по кусочкам
        return temp;
        };    

void __fastcall TForm1::Button6Click(TObject *Sender)
{
VirtGraph GG;
GG=G;
} //После нажатия на кнопку и перерисовке графа G происходит вылет
Расскажите, как вообще это правильно делается? Я почитал на вики про копирующий конструктор, вроде ясна суть, но как это в коде описать не понимаю пока что.
WarHamster вне форума Ответить с цитированием
Старый 20.11.2011, 21:02   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Если вы понимаете суть копирующего оператора присваивания и понимаете семантическую суть операции присваивания для вашего графа, то в чем проблема?! Выразите чеоез конструкции С++ смысл операции присваивания для вашего графа.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 20.11.2011, 21:10   #3
WarHamster
Пользователь
 
Регистрация: 09.08.2010
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Если вы понимаете суть копирующего оператора присваивания и понимаете семантическую суть операции присваивания для вашего графа, то в чем проблема?! Выразите чеоез конструкции С++ смысл операции присваивания для вашего графа.
Ну на мой взгляд, копирующий конструктор по коду получится почти идентичен перегрузке присваивания, а перегрузка присваивания в текущей реализации не помогает нифига. Потом, на вики вычитал:
Правило трёх (также известное как «Закон Большой Тройки» или «Большая Тройка») — правило в C++, гласящее, что если класс или структура определяет один из следующих методов, то они должны явным образом определить все три метода[1]:
Деструктор
Конструктор копирования
Оператор присваивания копированием
Т.е. надо и копирующий конструктор, и присваивание делать, чтобы все работало, или как?
WarHamster вне форума Ответить с цитированием
Старый 20.11.2011, 21:21   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Вам нало определиться, как вы хотите присваивать один объект другому, и почему вас не устраивает копирующий оператор присваивания по умолчанию. То есть забудьте про С++ и спросите себя, как должны присваиваться объекты вашего класса. У вас в этом ясности нет.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 20.11.2011, 21:28   #5
WarHamster
Пользователь
 
Регистрация: 09.08.2010
Сообщений: 48
По умолчанию

Не устраивает потому, что класс содержит в часности большую и толстую систему указателей на записи, присваивание по умолчанию копирует только ссылки, а не значения, и в результате при вызове деструктора для графа, в который осуществлялось присваивание, исходный граф тоже разрушается.
Как должны - вот, попытался перегрузить оператор присваивания, эффекта 0. Почему - не понимаю, прошу помочь.
WarHamster вне форума Ответить с цитированием
Старый 20.11.2011, 21:47   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Я так понимаю, вы так и не определились, как должны присваиваться ваши узлы. Например, есть узел Trailer. Как один такой узел должен присваиваться другому, и что при этом должно произойти. Я вам еще раз говорю, забудьте про С++, и на словах для себя четко сформулируйте, что означает операция присваивания одного узла другому. Тогда все будет ясно.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация классов. С++ Miito Фриланс 1 21.05.2010 20:04
С++ использование классов moron Общие вопросы C/C++ 0 03.04.2010 22:40
Реализацыя классов в С++ zoluxa Помощь студентам 1 23.03.2010 16:29
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18