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

Boost C++

Войти
Регистрация
Восстановить пароль
 
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
#1

save_construct_data не хочет быть вызвана - Boost C++

15.04.2013, 17:37. Просмотров 621. Ответов 5
Метки нет (Все метки)

Перегрузил функцию save_construct_data, но программа не хочет ее вызывать.
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
namespace mymath
{
    template<typename T> class Matrix;
}
 
 
namespace boost {
    namespace serialization {
 
        template<class Archive, typename T1>
            inline void load_construct_data(Archive & ar, mymath::Matrix<T1> * t, const unsigned int file_version);
        template<class Archive, typename T1>
            inline void save_construct_data(Archive & ar, const mymath::Matrix<T1> * t, const unsigned int file_version);
 
    }
}
 
namespace mymath
{
    template<typename T> class Matrix
    {
        public:
           // Constructors & Destructors.
            inline Matrix();
            inline Matrix(const Matrix<T> & original);
            inline Matrix(const unsigned rows, const unsigned cols);
            inline Matrix(const unsigned rows, const unsigned cols, const T val);
            inline Matrix(const unsigned rows, const unsigned cols, T * pdata);
            inline ~Matrix();
            inline void resize(const unsigned rows, const unsigned cols);
            inline T & operator()(const unsigned row, const unsigned col);
            ...
     private:
            ReferenceMatrix<T> * data_;
            friend class boost::serialization::access;
            template<class Archive, typename T1>
                void serialize(Archive & ar, mymath::Matrix<T1> * t, const unsigned int version)
                {
                    std::cout<<"Checkpoint 1"<<std::endl;;
                }
 
                template<class Archive, typename T1> 
                       friend void boost::serialization::load_construct_data(Archive & ar,
                                                                      mymath::Matrix<T1> * t, const unsigned int file_version);
                template<class Archive, typename T1> 
                      friend void boost::serialization::save_construct_data(Archive & ar, 
                                                                      const mymath::Matrix<T1> * t, const unsigned int file_version);
     };
}
 
namespace boost {
    namespace serialization {
 
            // Load data and create an object
            template<class Archive, typename T1>
                    inline void load_construct_data(Archive & ar, mymath::Matrix<T1> * t, const unsigned int file_version)
                    {
                        double value;
                        // Number of rows
                        int nRows;
                            ar >> nRows;
 
                            // Number of columns
                                int nCols;
                                ar >> nCols;
 
                                ::new(t) mymath::Matrix<double>(nRows, nCols);
 
                                // Save elements of the matrix
                                for (unsigned iRow = 0; iRow < nCols; ++iRow){
                                    for (unsigned iCol = 0; iCol < nCols; ++iCol){
                                        ar >> value;
                                        (*t)(iRow, iCol) = value;
                            }
                        }
 
 
                    }
 
             // Save data required to construct instance
             template<class Archive, typename T1>
                        inline void save_construct_data(Archive & ar, const mymath::Matrix<T1> * t, const unsigned int file_version)
                    {
                        // Number of rows
                            int nRows;
                            nRows = t->getRows();
                            // Number of columns
                            int nCols;
                            nCols = t->getCols();
                            std::cout<<nCols<<" Checkpoint 2 "<<nRows<<std::endl;
                            // Save size of the matrix
                            ar << nCols;
                            ar << nRows;
 
 
                            // Save elements of the matrix
                            for (unsigned iRow = 0; iRow < nCols; ++iRow){
                                    for (unsigned iCol = 0; iCol < nCols; ++iCol){
                                        ar << (*t)(iRow, iCol);
                                    }
                            }
 
 
                }
    }
}
И при попытке сохранить объект выполняется только
C++
1
2
3
4
5
 template<class Archive>
                void serialize(Archive & ar, const unsigned int version)
                {
                    std::cout<<"Checkpoint 1"<<std::endl;;
                }
Не ошибся ли с объявлением и перегрузкой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2013, 17:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос save_construct_data не хочет быть вызвана (Boost C++):

Может кто-нибудь из СПб хочет быть репетитором по Boost? - Boost C++
Я студент. Цель: для работы со звуком.

boost serialization. Перегрузка save_construct_data и load_constract_data для шаблонных классов - Boost C++
Добрый вечер, снова сериализация и снова проблема. Нужно сериализовать шаблонный класс без конструктора по умолчанию. Ниже приведен...

Остановка потока, в котором вызвана синхронная функция ввода вывода - Boost C++
Имется запущенный поток boost:thread. В нем вызван синхронная операция работы с портом read_some. Все работает хорошо до момента когда...

может ли быть вызвана объявленая, но неопределённая функция? - Delphi
Друзья! Ещё раз прошу иизвнения, если задену чьи-то чувства, но в дельфи я полный профан. ...Итак, качнул исходники Dev-Cpp (IDE C++,...

MDI не хочет быть Children - Visual Basic .NET
Вот вопрос возник. Пишу программу. Сначала были просто отдельные формы, но захотелось сделать MDI. Даны две формы: frmLoad и frmNewCard. В...

Компьютер не хочет работать с sata 2, как быть? - Жесткие диски
В один прекрасный день мой жёсткий диск(sata3) начал тупить и пропадать из биоса, из-за чего включить компьютер стало крайне непросто....

5
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
15.04.2013, 18:25 #2
Опять слишком мало данных... Что я делаю не так? Или вы хотите сохранить непосредственно объект? Так не получится. save/load вызываются только для указателей на объекты. Можно передать туда указатель на объект на стеке впринципе.

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
54
55
56
57
58
#include <iostream>
#include <sstream>
 
#include <boost/serialization/serialization.hpp>
#include <boost/archive/text_oarchive.hpp>
 
namespace test {
 
template<typename T>
class C;
 
}
 
namespace boost {
   namespace serialization {
 
template<typename Archive, typename T>
inline void save_construct_data(Archive&, const test::C<T>*, unsigned int);
 
   }
}
 
namespace test {
 
template<typename T>
class C
{
public:
   template<typename Archive>
   void serialize(Archive&, unsigned int) {}
private:
   friend class boost::serialization::access;
   template<typename Archive, typename U>
   friend void boost::serialization::save_construct_data(Archive&, const C<U>*, unsigned int);
};
 
}
 
namespace boost {
   namespace serialization {
 
template<typename Archive, typename T>
inline void save_construct_data(Archive&, const test::C<T>*, unsigned int)
{
   std::cout << "construct" << std::endl;
}
 
   }
}
 
int main()
{
   std::stringstream ss;
   boost::archive::text_oarchive oarch(ss);
   test::C<int>* c = new test::C<int>();
   oarch << c;
   delete c;
}
http://liveworkspace.org/code/1QbMhF$4
1
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
15.04.2013, 19:13  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
save/load вызываются только для указателей на объекты. Можно передать туда указатель на объект на стеке впринципе.
хм, окей. Тогда перегружать надо не save_construct_data а просто save?
и затем в load (не load_construct_data) создать новую матрицу?

мне нужно сохранить значения матрицы

C++
1
2
3
4
5
6
7
8
9
10
11
                            // Save size of the matrix
                            ar << nCols;
                            ar << nRows;
 
 
                            // Save elements of the matrix
                            for (unsigned iRow = 0; iRow < nCols; ++iRow){
                                    for (unsigned iCol = 0; iCol < nCols; ++iCol){
                                        ar << (*t)(iRow, iCol);
                                    }
                            }
и затем восстановить их после приема.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 int nRows;
 ar >> nRows;
 
 // Number of columns
 int nCols;
 ar >> nCols;
 ::new(t) mymath::Matrix<double>(nRows, nCols);
 
 // Save elements of the matrix
 for (unsigned iRow = 0; iRow < nCols; ++iRow){
         for (unsigned iCol = 0; iCol < nCols; ++iCol){
                    ar >> value;
                     (*t)(iRow, iCol) = value;
           }
 }

Цитата Сообщение от ForEveR Посмотреть сообщение
Опять слишком мало данных
Вот инициализация и сохранение матрицы:

C++
1
2
3
4
5
6
7
8
mymath::Matrix<double> m(nCols, nRows);
//заполняем матрицу
...
 
//записываем в архив
std::ofstream ofs("output.txt");
boost::archive::text_oarchive oa(ofs);
oa << m;
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
15.04.2013, 19:25 #4
sl_k, Не получится. Все это работает только с указателями. Единственный приемлимый вариант, если учитывать что конструировать ты собираешься сразу, а не сначала создавать объект, а потом заполнять - сохранить

C++
1
2
3
4
5
6
7
8
9
mymath::Matrix<double> m(nCols, nRows);
//заполняем матрицу
...
 
//записываем в архив
std::ofstream ofs("output.txt");
boost::archive::text_oarchive oa(ofs);
mymath::Matrix<double> mp = &m;
oa << mp;
Грузить так же как раньше.
1
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
15.04.2013, 19:38  [ТС] #5
ForEveR, окей, попробую. Хотя, в принципе, у меня уже инициализированный объект есть, куда заполнять. Создавать его уже не надо будет.

что то вроде

C++
1
2
3
4
5
6
7
8
9
10
11
12
mymath::Matrix<double> m(nCols, nRows);
//заполняем матрицу
...
 
//записываем в архив
std::ofstream ofs("output.txt");
boost::archive::text_oarchive oa(ofs);
 
oa << m;
 
mymath::Matrix<double> n(nCols, nRows);
ia >> n;
Добавлено через 10 минут
Тогда, наверное, можно будет просто заполнить serialize прям внутри класса, нет?
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
namespace mymath
{
    template<typename T> class Matrix
    {
        public:
           // Constructors & Destructors.
            inline Matrix();
            inline Matrix(const Matrix<T> & original);
            inline Matrix(const unsigned rows, const unsigned cols);
            inline Matrix(const unsigned rows, const unsigned cols, const T val);
            inline Matrix(const unsigned rows, const unsigned cols, T * pdata);
            inline ~Matrix();
            inline void resize(const unsigned rows, const unsigned cols);
            inline T & operator()(const unsigned row, const unsigned col);
            ...
     private:
            ReferenceMatrix<T> * data_;
            friend class boost::serialization::access;
            template<class Archive>
                void serialize(Archive & ar, const unsigned int version)
                {
                          for (unsigned i = 0; i < nRows; i++)
                               for(unsigned j = 0; j < nCols; j++)
                                   ar & (*this)(i, j); 
                }
 
 
     };
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
15.04.2013, 19:49 #6
sl_k, Да. Тогда достаточно serialize.
1
15.04.2013, 19:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2013, 19:49
Привет! Вот еще темы с ответами:

Как удалить прогу, которая не хочет быть удаленной? - Администрирование Windows
Добрый день, сабж. Сегодня по невнимательности запустил левый exe у себя на домашнем компьютере: класика жанра - скачал, думал там...

Программа не хочет запускаться, в чем может быть дело? - Windows XP
Здравствуйте! Сложилась такая ситуация: при работе с программами, да и просто в проводнике через небольшое время пропадает верхняя строка с...

Глючит страшно курсор: хочет сам все выделяет, хочет удаляет часть текста, хочет прыгает где ему вздумаеться - Периферийные устройства
Подскажите как быть...глючит страшно курсор: хочет сам все выделяет, хочет удаляет часть текста, хочет прыгает где ему вздумаеться(у меня...

ставит расширение екрана 1024х780. у меня 22 дюйма. мак. 1600х1200. все работало а теперь не хочет в чем может быть проблема?? - Windows 7
AMD Radeon HD 6570 драйвера на неее светит все работало потом комп вошол в спещий режим я включил и он заглючил. ставит расширение екрана...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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