2014-05-04 4 views
1

В моей программе я хочу, чтобы определить новый тип данных для IPAddressV4 для этой цели я определила следующий класс:Определение нового типа данных, который ведет себя как стандартный C++ типа данных

#include <boost/array.hpp> 
#include <boost/asio.hpp> 

#include "archive.hpp" 

using boost::asio::ip::address_v4; 
typedef boost::uint8_t  uint8; /**< 8-bit unsigned interger. */ 

class IPAddrV4 
{ 
public: 
/** 
* Construct a IPAddrV4 data type. 
*/ 
IPAddrV4() : _ip_address(0) 
{} 


/** 
* Construct a IPAddrV4 data type. 
* 
* @param ip_address The value of the IPv4 Address in text format. 
*/ 
IPAddrV4(std::string ip_address) : _ip_address(0) 
{ 
    *this = ip_address; 
} 

/** 
* Set the IPv4 Address value. 
* 
* @param val The value of the IPv4 Address in text format. 
* @return The reference to the IPAddrV4 data type. 
*/ 
IPAddrV4& operator=(std::string ip_address) 
{ 
    boost::asio::ip::address_v4::bytes_type bytes 
      = boost::asio::ip::address_v4::from_string(ip_address).to_bytes(); 

    _ip_address = ((uint32(bytes.at(0)) << 24) | 
        (uint32(bytes.at(1)) << 16) | 
        (uint32(bytes.at(2)) << 8) | 
        uint32(bytes.at(3))); 

    return *this; 
} 

IPAddrV4& operator=(uint32 ip_address) 
{ 
    _ip_address = ip_address; 
    return *this; 
} 

/** 
* Get the IPv4 Address data type value. 
* 
* @return The IPv4 Address data type value in binary form. 
*/ 
operator uint32() 
{ 
    return _ip_address; 
} 

private: 
    uint32 _ip_address; 

}; 

Позже я Я использую этот класс для выполнения сериализации и десериализации для передачи данных по TCP-соединению. Когда я делаю сериализацию с выходным архивом, у меня нет никаких проблем.

IPAddrV4 ip("127.0.0.1"); 
oarchive & ip; 

В приведенном выше примере значение IP преобразуется в двоичную форму и затем копируется в выходной архив. И архетист увеличит свой размер на 4 байта.

Но когда я пытаюсь использовать этот тип данных с архивом ввода для сериализации я проблема:

IPAddrV4 ip; 
iarchive & ip; 

Это ошибка, которую я получаю во время компиляции:

No match for 'operator&' in 'input_Archive & IPAddrV4::operator uint32()' 

Так что я отсутствую в IPAddrV4?

Примечание: Входной архив отлично работает со стандартными типами данных C++, такими как uint, string..etc.

+0

Одно замечание: вы пишете конструктор с точки зрения задания. Не делай этого, это ужасно неэффективно. Напишите свое назначение в терминах конструктора, за которым следует своп. –

+0

Я не уверен, что правильно вас понял, можете ли вы объяснить, почему он говорит, почему он неэффективен? – IoT

+1

Конструктор полностью инициализирует все элементы до первого «{». Ваш конструктор делает это, а затем вызывает * this = ip_address, который вызывает вызов оператора присваивания. По сути, он дважды присваивает значения переменным-членам. –

ответ

1
+0

Так что @sehe, моя проблема в том, что я не перегружал оператора? Я должен использовать BOOST_STRONG_TYPEDEF, который делает работу для меня, правильно? – IoT

+0

Я не использую архив Boost, извините, я должен был упомянуть об этом. У меня есть собственные классы для ввода и вывода архива. Так работает BOOST_STRONG_TYPEDEF? – IoT

+1

Сильные typedefs работают на переднем конце (выбор реализаций сериализации для вашего класса), а не на заднем конце, так что вы хороши. – sehe

1

Я нашел ошибку, я должен изменить перегрузку оператора uint32() быть uint32&() следующим образом:

operator uint32 &() 
{ 
    return _ip_address; 
} 

В этом случае я возвращаю значение по ссылке не по значению для архива ввода.

+0

Да, это все. Очень распространенная версия с последовательной сериализацией: S – sehe

Смежные вопросы