>

2 명으로 구성된 수업이 있습니다 멤버 중 하나를 사용하여 다른 멤버를 구성해야합니다.

정의 :

msat::tracker::Parser m_parser;
msat::tracker::TCPServer m_tcpServer;

생성자에서 :

TrackerInterface::TrackerInterface(const core::logging::ILog& consoleLog,
                                   const core::logging::IDataLog& dataLog,
                                   core::event::IQueue& eventQueue)
   : m_parser(consoleLog,dataLog,eventQueue),
     m_tcpServer(consoleLog,m_parser,eventQueue,0,8,10)
{
}

그래서 m_parser 를 만듭니다  먼저 m_tcpServer 의 생성자에게 전달하십시오. 코드가 컴파일되었지만 내 질문은이 접근법에 문제가 있습니까?

  • 답변 # 1

    와이즈 비즈

    잠재적으로는 가능합니다.

    구성원이 구성 내에서만 필요로하지 않고 다른 구성원에 대한 참조를 저장하고 클래스가 복사 가능하거나 이동 가능한 경우 내재적으로 생성 된 생성자 및 할당 연산자는 한 구성원이 수행하는 상태로 객체를 남겨 둡니다. 동일한 수퍼 오브젝트의 다른 멤버를 참조하거나 가리 키지 않으며 매달린 채있을 수도 있습니다.

    이 경우 한 멤버가 항상 같은 객체의 다른 멤버를 참조하거나 가리 키도록 클래스 불변을 지정해야하며 해당 불변을 적용하려면 사용자 정의 복사 및 이동 생성자와 할당 연산자를 구현해야합니다.

    그 외에는 멤버를 올바른 순서로 초기화하는 데주의해야합니다. 멤버는 선언 순서대로 초기화됩니다.

  • 답변 # 2

    그렇습니다. 초기화 순서는 이니셜 라이저 목록의 멤버 순서가 아니라 멤버의 선언 순서를 기반으로한다는 것을 기억하십시오.

    와이즈 비즈

    따라서 순서대로 선언하고 순서를 변경해서는 안되며 모든 것이 정상이라는 의견을 추가하십시오.

    The code compiles but my question is are there any issues with this approach?

    12.6.2 Initializing bases and members
    ...
    13 In a non-delegating constructor, initialization proceeds in the following order:
    ...
    (13.3) — Then, non-static data members are initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).

    Source

관련 자료

  • 이전 Oracle SQL CMD 라인
  • 다음 regex - 쉼표없이 숫자를 반환하는 정규식