идиома именованного параметра c ++ - строковое свойство не установлено - PullRequest
0 голосов
/ 16 октября 2018

Пожалуйста, рассмотрите следующий (простой) код.Странное (?) Поведение в подпрограмме main() и подробно описано ниже.

класс данных

Packet.h

#include <string>

class Packet {
public:
    Packet(int iParam, std::string sParam);
    ~Packet();
    void setInt(int iParam);
    void setString(std::string sParam);

private:
    int iProperty_;
    std::string sProperty_;
};

Packet.cpp

#include "Packet.h"
using std::string;

Packet::Packet(int iParam, string sParam) : iProperty_(iParam), 
    sProperty_(sParam) {}
Packet::~Packet() {}

void Packet::setInt(int iParam) {
    iProperty_ = iParam;
}
void Packet::setString(std::string sParam) {
    sProperty_ = sParam;
}

класс контроллера

PacketController.h

#include <string>

class PacketController {
public:
    PacketController();
    ~PacketController();
    PacketController & andSetInt(int iParam);
    PacketController & andSetString(std::string sParam);

private:
    Packet packet_;
};

PacketController.cpp

#include "PacketController.h"
using std::string;

PacketController::PacketController() : packet_(0, "") {}
PacketController::~PacketController() {}

PacketController & PacketController::andSetInt(int iParam) {
    packet_.setInt(iParam);
    return *this;
}

PacketController & PacketController::andSetString(string sParam) {
    packet_.setString(sParam);
    return *this;
}

main ()

int main() {
    PacketController& ctrlRef = PacketController()
        .andSetString("hello world")
        .andSetInt(19);

    PacketController ctrlVal = PacketController()
        .andSetString("hello world")
        .andSetInt(19);

    PacketController& ctrlRef2 = PacketController();
    ctrlRef2.andSetString("hello world")
        .andSetInt(19);

    return 0;
}

Если выполнение приостановлено в строке return 0; из main(), то следующие значения отображаются навнутренние packet_ объекты:

ctrlRef - packet_: iProperty_: 19 sProperty_: ""

ctrlVal - packet_: iProperty_: 19 sProperty_: "hello world"

ctrlRef2 - packet_: iProperty_: 19 sProperty_: "hello world"

Так почему же sProperty_ пуст на объекте packet_ в ctrlRef?Это как-то связано с тем, что ссылка инициализируется при инициализации объекта PacketController?Но тогда почему iProperty_ для packet_ объекта ctrlRef правильно установлено на 19?

1 Ответ

0 голосов
/ 16 октября 2018
PacketController& ctrlRef = PacketController()
    .andSetString("hello world")
    .andSetInt(19);

ctrlRef - это ссылка на временное устройство, срок службы которого закончился в конце оценки полного выражения (прямо в ;).То же самое можно сказать о ctrlRef2.

. Использование его приводит к неопределенному поведению .

С другой стороны, ctrlVal является значением, инициализированным из временного,Использование это нормально.

...