Why is using the assignment operator on a dereferenced pointer to a purely abstract interface not a compiler error? When could this ever be useful? It seems like it can only lead to subtle bugs as I've outlined below.
In order to have a globally accessible object, which implements an interface, with a default value, that I can later override, do I have to use a handle (pointer to a pointer -- or -- pointer to a std::unique_ptr), or is there another approach?
#include <iostream>
class Interface {
public:
virtual int Value() = 0;
};
class Implementation : public Interface {
public:
Implementation(int value) : value(value) {}
int Value() override {
return value;
}
int value;
};
// Set default value
Interface* object = new Implementation(1);
Implementation* object2 = new Implementation(2);
int main() {
// Why is this line not a compiler error?
*object = Implementation(3); // Try to override default value
*object2 = Implementation(4); // Override default value
// This outputs "14", not "34", why?
std::cout << object->Value() << object2->Value();
return 0;
}
To get around these issues, as well as allow setting the overriding the default value in unit tests, I have gone with the following approach.
// Set default value
static std::unique_ptr<Interface> object(new Implementation(1));
void SetObject(std::unique_ptr<Interface> obj) {
object.reset(obj.release());
}
int main() {
SetObject(std::make_unique<Implementation>(2)); // Override default value
std::cout << object->Value();
return 0;
}