[CPP] Member Initializer 잘못된 사용의 에러

윤동환·2023년 6월 12일
0

CPP

목록 보기
3/5

Member Initializer를 사용하여 초기화하는데 아래와 같은 에러가 발생하였다.

/home/ydh/src/library/include/smpp_v2/receiver.hpp:12:28: warning: 'Receiver::endpoint_iterator_' will be initialized after [-Wreorder]
   tcp::resolver::iterator  endpoint_iterator_;
                            ^~~~~~~~~~~~~~~~~~
/home/ydh/src/library/include/smpp_v2/receiver.hpp:10:20: warning:   'boost::asio::ip::tcp::socket Receiver::socket_' [-Wreorder]
   tcp::socket      socket_;
                    ^~~~~~~
/home/ydh/src/program/OJT/smpp_v2/receiver.cpp:20:1: warning:   when initialized here [-Wreorder]
 Receiver::Receiver(boost::asio::io_context& io_context,tcp::resolver::iterator endpoint_iterator)
 ^~~~~~~~

초기화 하는 코드

Transmitter::Transmitter(boost::asio::io_context& io_context,tcp::resolver::iterator endpoint_iterator)
    : io_context_(io_context),
    endpoint_iterator_(endpoint_iterator),
    socket_(io_context),
    connected_(false),
    timer_(io_context)
{

class 에 선언된 부분

class Transmitter {
    //connect tcp
    private :
        static bool                 binded_;
        tcp::socket                 socket_;
        boost::asio::io_context&    io_context_;
        tcp::resolver::iterator     endpoint_iterator_;
        bool                        connected_;
        smpp_message                read_msg_;
        boost::asio::deadline_timer timer_;

원인

멤버 이니셜라이저를 사용하여 초기화 할 경우 초기화 코드의 순서대로가 아닌 class에 선언된 순서대로 초기화가 됩니다.
따라서 iocontext, endpointiterator, socket 순으로 초기화 되는것이 아니라, 실제로는 socket, iocontext endpointiterator순으로 초기화 되어 예상하지못한 초기화가 발생할 수 있다는 것을 알려줍니다.

제가 겪은 경우, io_context라는 동일한 값으로 여러 변수를 초기화 하기에 발생 가능한 문제입니다.

오류를 미리 방지하기 위해서 순서를 맞춰주면 경고는 사라집니다.

profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글