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

Reply via email to