Jeroen T. Vermeulen wrote: > On Thu, June 28, 2007 03:57, Fei Liu wrote: > > >> I want a persistent connection, a connection to postgresql database >> server I can use throughout the lifetime of my program. As we know, >> connecting and disconnecting from a server can be expensive. It seems I >> simply cann't do this with libpqxx. For example, >> > > Yes you can! The problem is just a simple misunderstanding about C++ > syntax. It looks like you're probably coming from a Java background, so > I'll explain on that assumption. > > > >> #include <pqxx/pqxx> >> class mydbh{ >> private: >> pqxx::connection c; >> public: >> mydbh(){ >> c = pqxx::connection(""); >> } >> }; >> > > In C++, unlike Java, when you create a variable of object type (such as > the member variable "pqxx::connection c;") then you get an instance of the > object, not a reference. So you don't need to assign c in your > constructor. The object is already there. > > Also, when you write a constructor in C++, you initialize base-class > objects and members with a special syntax. So unlike Java, those > constructor calls come *before* the constructor body. > > So in this case, you'd do: > > mydbh() : > c("") > { > } > > Of course, if you're using the empty connection string, you can just use > the default constructor for the connection: > > mydb() : c() {} > > Which is also what the compiler assumes as the definition for your > constructor. So in your example, you can even make things work by leaving > out your constructor entirely! This class definition does exactly the > same things as your example above (although of course you'll want to add > your own member functions): > > #include <pqxx/pqxx> > class mydbh{ > pqxx::connection c; > }; > > Done. The connection connects when you create this object. If you want > to have a constructor that lets you specify your own connection string, > you add: > > explicit mydbh(const std::string &connstring) : c(connstring) {} > > The "explicit" keyword says that this is not providing an implicit > conversion from string to mydbh. That will help protect you from subtle > mistakes in code using your mydbh class. > > > >> I simply can't compile this code due to connection class design >> decision. Is there a workaround of this problem? Or am I missing >> something completely? >> > > It has nothing to do with the connection class design. This is a common > problem for C++ beginners to run into. > > > Jeroen > > > Thanks, I had a fair amount of C++ experience, but this member initialization piece slipped through my mind when I was attempting various ways to initialize c. It's working fine now.
Fei _______________________________________________ Libpqxx-general mailing list Libpqxx-general@gborg.postgresql.org http://gborg.postgresql.org/mailman/listinfo/libpqxx-general