Вот соответствующий ответ: если вы не хотите, чтобы кто-то создал объект, не давайте ему открытый конструктор!
Серьезно, вы можете иметь объект фабрики, сделать его другом класса, для которого вы хотите ограничить конструкцию, и сделать конструктор этого класса приватным. Таким образом, единственный способ получить доступ к объекту (даже не обязательно создавая его в данный момент) будет через вашу фабрику.
, например
#include <boost/noncopyable.hpp>
#include <string>
class ConnectionFactory;
class DatabaseConnection : boost::noncopyable {
// can only be created by ConnectionFactory which happens to
// know how to connect to our database server!
friend class ConnectionFactory;
DatabaseConnection(std::string username, std::string password /*etc*/);
// don't want any random user to reset the connection!
~DatabaseConnection();
public:
// public interface bits
void Execute(const Select&);
// ...
};
ConnectionFactory {
public:
DatabaseConnection& conn();
};
class MayNeedDbConnection {
ConnectionFactory factory;
public:
explicit MayNeedDbConnection(const ConnectionFactory& f) : factory(f)
{}
void SelectStuff() {
DatabaseConnection& conn = factory.conn();
conn.Execute(....);
}
};
int main()
{
ConnectionFactory factory;
MayNeedDbConnection md(factory);
md.SelectStuff();
}