2013-07-03 5 views
2

У меня есть класс с 2-й открытыми конструкторами, что я хочу вызвать частный конструктор:Вызов другого конструктора в том же классе

class CDeviceTSGetObservationResponse : public CDeviceServerResponse 
{ 
public: 
    /** 
    * Public constructor. Used to construct a response containing 
    * the required information from the TotalStation device. 
    * 
    * @param horizontalAngle 
    *   The horizontal angle. 
    * @param verticalAngle 
    *   The vertical angle. 
    * @param slopeDistance 
    *   The slope distance. 
    */ 
    CDeviceTSGetObservationResponse(double horizontalAngle, 
            double verticalAngle, 
            double slopeDistance) 
     : CDeviceTSGetObservationResponse(CDeviceServerResponse::SUCCESS_MESSAGE, 
             horizontalAngle, 
             verticalAngle, 
             slopeDistance) {} 

    /** 
    * Public constructor. Used to construct a response containing 
    * the error message from the TotalStation device. 
    * 
    * @param errorMsg 
    *   The error message for the response. 
    */ 
    CDeviceTSGetObservationResponse(std::string errorMsg) 
     : CDeviceTSGetObservationResponse(errorMsg, 
             0.0, 
             0.0, 
             0.0) {} 

private: 
    /** 
    * Private constructor. 
    * 
    * @param errorMsg 
    *   The error message for the response. 
    * @param horizontalAngle 
    *   The horizontal angle. 
    * @param verticalAngle 
    *   The vertical angle. 
    * @param slopeDistance 
    *   The slope distance. 
    */ 
    CDeviceTSGetObservationResponse(std::string errorMsg, 
            double  horizontalAngle, 
            double  verticalAngle, 
            double  slopeDistance) 
     : CDeviceServerResponse(CDeviceServerResponse::TS_GET_OBSERVATION, 
           errorMsg), 
     m_dHorizontalAngle(horizontalAngle), 
     m_dVerticalAngle(verticalAngle), 
     m_dSlopeDistance(slopeDistance){} 

    /** The horizontal angle. */ 
    double m_dHorizontalAngle; 

    /** The vertical angle. */ 
    double m_dVerticalAngle; 

    /** The slope distance. */ 
    double m_dSlopeDistance; 
}; // CDeviceTSGetObservationResponse 

Таким образом, пользователь будет либо вызвать конструктор проходящий три булевых, если не было проблема, и сообщение об ошибке в baseclass по умолчанию будет успешным.

Или они вызывают конструктор, проходящий в сообщении об ошибке, который по умолчанию будет равен 0.0.

Я думал, что я мог бы сделать это с помощью приведенной выше коды, но я получаю следующее сообщение об ошибке:

camd011> make 
g++ -c CDeviceTSGetObservationResponse.cpp \ 
     -I.. -o bin/CDeviceTSGetObservationResponse.o 
In file included from CDeviceTSGetObservationResponse.cpp:13:0: 
CDeviceTSGetObservationResponse.h: In constructor 'device::response::CDeviceTSGetObservationResponse::CDeviceTSGetObservationResponse(double, double, double)': 
CDeviceTSGetObservationResponse.h:44:10: error: type 'device::response::CDeviceTSGetObservationResponse' is not a direct base of 'device::response::CDeviceTSGetObservationResponse' 
CDeviceTSGetObservationResponse.h:47:55: error: no matching function for call to 'device::response::CDeviceServerResponse::CDeviceServerResponse()' 
CDeviceTSGetObservationResponse.h:47:55: note: candidates are: 
CDeviceServerResponse.h:72:4: note: device::response::CDeviceServerResponse::CDeviceServerResponse(device::response::CDeviceServerResponse::EServerMessageIdentifier, std::string) 
CDeviceServerResponse.h:72:4: note: candidate expects 2 arguments, 0 provided 
CDeviceServerResponse.h:31:7: note: device::response::CDeviceServerResponse::CDeviceServerResponse(const device::response::CDeviceServerResponse&) 
CDeviceServerResponse.h:31:7: note: candidate expects 1 argument, 0 provided 
CDeviceTSGetObservationResponse.h: In constructor 'device::response::CDeviceTSGetObservationResponse::CDeviceTSGetObservationResponse(std::string)': 
CDeviceTSGetObservationResponse.h:57:10: error: type 'device::response::CDeviceTSGetObservationResponse' is not a direct base of 'device::response::CDeviceTSGetObservationResponse' 
CDeviceTSGetObservationResponse.h:57:42: error: 'errorMeg' was not declared in this scope 
CDeviceTSGetObservationResponse.h:60:45: error: no matching function for call to 'device::response::CDeviceServerResponse::CDeviceServerResponse()' 
CDeviceTSGetObservationResponse.h:60:45: note: candidates are: 
CDeviceServerResponse.h:72:4: note: device::response::CDeviceServerResponse::CDeviceServerResponse(device::response::CDeviceServerResponse::EServerMessageIdentifier, std::string) 
CDeviceServerResponse.h:72:4: note: candidate expects 2 arguments, 0 provided 
CDeviceServerResponse.h:31:7: note: device::response::CDeviceServerResponse::CDeviceServerResponse(const device::response::CDeviceServerResponse&) 
CDeviceServerResponse.h:31:7: note: candidate expects 1 argument, 0 provided 
CDeviceTSGetObservationResponse.cpp: In member function 'void device::response::CDeviceTSGetObservationResponse::serialize(Archive&, unsigned int)': 
CDeviceTSGetObservationResponse.cpp:38:14: error: 'base_object' is not a member of 'boost::serialization' 
CDeviceTSGetObservationResponse.cpp:38:69: error: expected primary-expression before '>' token 
make: *** [bin/CDeviceTSGetObservationResponse.o] Error 1 
+0

Вы хотите использовать 'this (arguments)'? – NINCOMPOOP

+0

Основная ошибка: CDeviceTSGetObservationResponse.h: 44: 10: error: type 'device :: response :: CDeviceTSGetObservationResponse' не является прямой базой 'device :: response :: CDeviceTSGetObservationResponse' –

+0

Используя это (аргументы) дает ошибку: CDeviceTSGetObservationResponse.h: 44: 10: ошибка: ожидаемый идентификатор до «this» –

ответ

7

Что вы ищете, это делегирование конструкторов, и они доступны только с C++ 11.

Например:

struct A 
{ 
    int x; 

    A(): A(10) {} 

private:  
    A(int val): x(val) {} 
}; 

int main(int argc, char* argv[]) 
{ 
    A a; 

    return 0; 
} 

Как вы можете увидеть here компилируется с C++ 11, но если вы посмотрите here тот же код не компилируется (до C++ 11)

+0

Проблема заключается в том, компилятор Microsoft. Мой код компилируется в Unix с C++ 11, но Microsoft Visual Studio 12 - это другое дело. Ho ... hum. –

1

Это лучше, чтобы обеспечить нормальный частный метод вместо частного конструктора, и называют это один в тело других определений конструктора.

Вы не можете использовать списки инициализаторов членов для такого частного метода, но, конечно же, инициализировать все члены по мере необходимости в теле метода.

UPDATE:
Кроме того, сообщения об ошибках указывают вы используете свой класс в некотором контексте, который требует конструктор по умолчанию.

-1

OK Я удалил частный конструктор и переписал два публичных типа следующим образом:

/** 
    * Public constructor. Used to construct a response containing 
    * the required information from the TotalStation device. 
    * 
    * @param horizontalAngle 
    *   The horizontal angle. 
    * @param verticalAngle 
    *   The vertical angle. 
    * @param slopeDistance 
    *   The slope distance. 
    */ 
    CDeviceTSGetObservationResponse(double horizontalAngle, 
            double verticalAngle, 
            double slopeDistance) 
     : CDeviceServerResponse(CDeviceServerResponse::TS_GET_OBSERVATION, 
           CDeviceServerResponse::SUCCESS_MESSAGE), 
     m_dHorizontalAngle(horizontalAngle), 
     m_dVerticalAngle(verticalAngle), 
     m_dSlopeDistance(slopeDistance) {} 

    /** 
    * Public constructor. Used to construct a response containing 
    * the error message from the TotalStation device. 
    * 
    * @param errorMsg 
    *   The error message for the response. 
    */ 
    CDeviceTSGetObservationResponse(std::string errorMsg) 
     : CDeviceServerResponse(CDeviceServerResponse::TS_GET_OBSERVATION, 
           errorMsg), 
     m_dHorizontalAngle(0.0), 
     m_dVerticalAngle(0.0), 
     m_dSlopeDistance(0.0) {} 
+0

Не знаете, почему это было отклонено, поскольку оно обеспечило то, что мне было необходимо, без чтобы написать другую ненужную функцию. –

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