namespace bad
{
class Data // always initializes its members, leaves no choice to the client code :(
{
private:
int _i;
float _f;
void* _p;
public:
Data() : _i(0), _f(0.f), _p(nullptr) { }
void SetI(int value) { _i = value; }
void SetF(float value) { _f = value; }
void SetP(void* value) { _p = value; }
double GetSomethingMeaningful() const { return !_p ? (_f * _i) : *(double*)_p; }
};
}
namespace good
{
class BasicData // base class for DataSafe and DataFast
{
protected:
int _i;
float _f;
void* _p;
protected:
BasicData() = default; // no initialization, leaves moosor!
BasicData(int i, float f, void* p) : _i(i), _f(f), _p(p) { }
public:
void SetI(int value) { _i = value; }
void SetF(float value) { _f = value; }
void SetP(void* value) { _p = value; }
double GetSomethingMeaningful() const { return !_p ? (_f * _i) : *(double*)_p; }
};
class DataSafe : public BasicData // always initializes its members
{
public:
DataSafe() : BasicData(0, 0.f, nullptr) { }
};
class DataFast : public BasicData // no implicit members' initialization
{
};
}
#include <iostream>
using std::cout;
int main()
{
double d = 42.0;
void* pd = (void*)&d;
{
bad::Data obj;
obj.SetI(2);
obj.SetF(3.14);
cout << obj.GetSomethingMeaningful() << '\n';
}
{
good::DataSafe obj;
obj.SetF(3.14);
cout << obj.GetSomethingMeaningful() << '\n';
}
{
good::DataFast obj;
obj.SetP(pd);
cout << obj.GetSomethingMeaningful() << '\n';
}
}
bmFtZXNwYWNlIGJhZAp7CgljbGFzcyBEYXRhIC8vIGFsd2F5cyBpbml0aWFsaXplcyBpdHMgbWVtYmVycywgbGVhdmVzIG5vIGNob2ljZSB0byB0aGUgY2xpZW50IGNvZGUgOigKCXsKCXByaXZhdGU6CgkgICAgaW50ICAgX2k7CgkgICAgZmxvYXQgX2Y7CgkgICAgdm9pZCogX3A7CgoJcHVibGljOgoJICAgIERhdGEoKSA6IF9pKDApLCBfZigwLmYpLCBfcChudWxscHRyKSB7IH0KCSAgICAKCSAgICB2b2lkIFNldEkoaW50ICAgdmFsdWUpIHsgX2kgPSB2YWx1ZTsgfQoJICAgIHZvaWQgU2V0RihmbG9hdCB2YWx1ZSkgeyBfZiA9IHZhbHVlOyB9CgkgICAgdm9pZCBTZXRQKHZvaWQqIHZhbHVlKSB7IF9wID0gdmFsdWU7IH0KCSAgICAKCSAgICBkb3VibGUgR2V0U29tZXRoaW5nTWVhbmluZ2Z1bCgpIGNvbnN0IHsgcmV0dXJuICFfcCA/IChfZiAqIF9pKSA6ICooZG91YmxlKilfcDsgfQoJfTsKfQoKbmFtZXNwYWNlIGdvb2QKewoJY2xhc3MgQmFzaWNEYXRhIC8vIGJhc2UgY2xhc3MgZm9yIERhdGFTYWZlIGFuZCBEYXRhRmFzdAoJewoJcHJvdGVjdGVkOgoJICAgIGludCAgIF9pOwoJICAgIGZsb2F0IF9mOwoJICAgIHZvaWQqIF9wOwoKCXByb3RlY3RlZDoKCSAgICBCYXNpY0RhdGEoKSA9IGRlZmF1bHQ7IC8vIG5vIGluaXRpYWxpemF0aW9uLCBsZWF2ZXMgbW9vc29yIQoJICAgIEJhc2ljRGF0YShpbnQgaSwgZmxvYXQgZiwgdm9pZCogcCkgOiBfaShpKSwgX2YoZiksIF9wKHApIHsgfQoKCXB1YmxpYzoKCSAgICB2b2lkIFNldEkoaW50ICAgdmFsdWUpIHsgX2kgPSB2YWx1ZTsgfQoJICAgIHZvaWQgU2V0RihmbG9hdCB2YWx1ZSkgeyBfZiA9IHZhbHVlOyB9CgkgICAgdm9pZCBTZXRQKHZvaWQqIHZhbHVlKSB7IF9wID0gdmFsdWU7IH0KCgkgICAgZG91YmxlIEdldFNvbWV0aGluZ01lYW5pbmdmdWwoKSBjb25zdCB7IHJldHVybiAhX3AgPyAoX2YgKiBfaSkgOiAqKGRvdWJsZSopX3A7IH0KCX07CgkKCWNsYXNzIERhdGFTYWZlIDogcHVibGljIEJhc2ljRGF0YSAvLyBhbHdheXMgaW5pdGlhbGl6ZXMgaXRzIG1lbWJlcnMKCXsKCXB1YmxpYzoKCQlEYXRhU2FmZSgpIDogQmFzaWNEYXRhKDAsIDAuZiwgbnVsbHB0cikgeyB9Cgl9OwoJCgljbGFzcyBEYXRhRmFzdCA6IHB1YmxpYyBCYXNpY0RhdGEgLy8gbm8gaW1wbGljaXQgbWVtYmVycycgaW5pdGlhbGl6YXRpb24KCXsKCX07Cn0KCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgc3RkOjpjb3V0OwoKaW50IG1haW4oKQp7Cglkb3VibGUgZCA9IDQyLjA7Cgl2b2lkKiBwZCA9ICh2b2lkKikmZDsKCQoJewoJICAgIGJhZDo6RGF0YSBvYmo7CgkgICAgb2JqLlNldEkoMik7CgkgICAgb2JqLlNldEYoMy4xNCk7CgkgICAgY291dCA8PCBvYmouR2V0U29tZXRoaW5nTWVhbmluZ2Z1bCgpIDw8ICdcbic7Cgl9CgkKCXsKCSAgICBnb29kOjpEYXRhU2FmZSBvYmo7CgkgICAgb2JqLlNldEYoMy4xNCk7CgkgICAgY291dCA8PCBvYmouR2V0U29tZXRoaW5nTWVhbmluZ2Z1bCgpIDw8ICdcbic7Cgl9CgkKCXsKCSAgICBnb29kOjpEYXRhRmFzdCBvYmo7CgkgICAgb2JqLlNldFAocGQpOwoJICAgIGNvdXQgPDwgb2JqLkdldFNvbWV0aGluZ01lYW5pbmdmdWwoKSA8PCAnXG4nOwoJfQp9Cg==