Tôi đang cố gắng sắp xếp các cấu trúc dữ liệu của mình để ghi chúng vào một ổ cắm tcp.Lỗi khi sắp xếp một lớp trừu tượng bằng cách tăng
Cho đến nay tôi nhận thấy rằng sự cố của tôi là sự tuần tự hóa. Tôi thậm chí đã cố gắng sử dụng
BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)
nhưng tôi không thể tìm thấy bất kỳ ví dụ làm việc nào tương tự như chương trình của tôi và cách triển khai đúng cách.
Dưới đây là một số trong các liên kết mà tôi đã truy cập:
- http://programmers-blog.com/category/c-c
- http://www.boost.org/doc/libs/1_48_0/libs/serialization/doc/tutorial.html#simplecase
- http://en.highscore.de/cpp/boost/serialization.html#serialization_class_hierarchies
cấu trúc dữ liệu của tôi là một chút phức tạp hơn sau đó này nhưng chúng ta hãy giả định rằng tôi có cấu trúc sau đây
Coordinate.h
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
class Coordinate {
public:
Coordinate() {}
Coordinate(int c) : c(c) {}
int get(void) { return c; }
std::string toString(void);
private:
int c;
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & this->c;
}
};
Move.h
class Coordinate;
#include "Coordinate.h"
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
class Move {
public:
Move() {}
~Move() {}
Coordinate* getCoordinate(void) {return this->destination; }
virtual bool isJump(void) = 0;
protected:
Coordinate *destination;
private:
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & this->destination;
}
};
MoveNormal.h
class Coordinate;
#include "Move.h"
#include "Coordinate.h"
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
class MoveNormal : public Move {
public:
MoveNormal() {}
MoveNormal(Coordinate *destination) { this->destination = destination; }
~MoveNormal() {}
virtual bool isJump(void);
private:
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & boost::serialization::base_object<Move>(*this);
}
};
Các phương pháp ảo được quy định tại đây.
MoveNormal.cpp
#include "MoveNormal.h"
bool MoveNormal::isJump(void) {
return false;
}
main.cpp của tôi trông như thế này:
#include "Coordinate.h"
#include "Move.h"
#include "MoveNormal.h"
#include <fstream>
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
int main(int argc, char *argv[]) {
Coordinate *c = new Coordinate(10);
// This runs OK
/*
{
std::ofstream ofs("f.txt");
boost::archive::text_oarchive oa(ofs);
oa << c;
}
Coordinate *d;
{
std::ifstream ifs("f.txt");
boost::archive::text_iarchive ia(ifs);
ia >> d;
}
std::cout << "c.get(): " << c->get() << std::endl;
std::cout << "d.get(): " << d->get() << std::endl;
*/
// This is where I get my error
Move *m = new MoveNormal(c);
{
std::ofstream ofs("f.txt");
boost::archive::text_oarchive oa(ofs);
oa << m; // Line where the error occurs
}
return 0;
}
Nhưng khi tôi chạy chương trình tôi nhận được lỗi sau:
Unhandled exception at 0x76dbb9bc in Test.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x001df078..
tôi m sử dụng VS2010 và Tăng 1.48.0.
khai báo toán tử quá tải << như một người bạn của lớp, sau đó thực hiện nó, Xem xét cấu trúc dữ liệu của bạn chỉ bao gồm giá trị int. làm. Nếu bạn cần truyền điều này qua một socket, chỉ cần reinterpret_cast int vào char * và gửi nó qua socket;) – johnathon
Thực tế là cấu trúc dữ liệu của tôi không chỉ có một int. Ví dụ trên đây là một cấu trúc đơn giản được tạo ra chỉ dành cho trường hợp này. Hãy xem xét rằng bên trong cấu trúc của tôi tôi có con trỏ đến các lớp khác và container stl. Cho đến nay tôi nghĩ rằng tôi đã tìm ra cách để làm cho nó hoạt động. Tôi chỉ đang thử nghiệm nó trong dự án của tôi và tôi sẽ đăng giải pháp ở đây càng sớm càng tốt. – ealves