Hi,
I found this in code I was maintaining
template <class SingletonClass>
SingletonClass* Singleton<Singl etonClass>::ins tance ()
{
static SingletonClass _instance;
return &_instance;
}
there are indications that the constructor is getting called more than
once
in some circumstances (tracing in one of the instantiations of the
template).
Are there potential problems with the use of static data?
--
Nick Keighley 15 3031
Nick Keighley wrote:
Hi,
I found this in code I was maintaining
template <class SingletonClass>
SingletonClass* Singleton<Singl etonClass>::ins tance ()
{
static SingletonClass _instance;
return &_instance;
}
there are indications that the constructor is getting called more than
once
in some circumstances (tracing in one of the instantiations of the
template).
Are there potential problems with the use of static data?
There are sometimes, but there's nothing inherently wrong with this
code (you might consider using references instead, however). See
chapter 6 of _Modern C++ Design_ for more than you ever wanted to know
about singletons in C++.
Cheers! --M
Hi Nick,
there are indications that the constructor is getting called more
than once in some circumstances (tracing in one of the
instantiations of the template).
Are there potential problems with the use of static data?
I had exactly this problem when using Visual C++ 6.0. But only
in Release mode, not in Debug mode. Perhaps a problem with
the optimizer...?!
The solution was to move the implementation of the instance()
method from the .h to the .cpp file.
Hope it helps...
Tilman
mlimber wrote:
Nick Keighley wrote:
Hi,
I found this in code I was maintaining
template <class SingletonClass>
SingletonClass* Singleton<Singl etonClass>::ins tance ()
{
static SingletonClass _instance;
return &_instance;
}
there are indications that the constructor is getting called more than
once
in some circumstances (tracing in one of the instantiations of the
template).
Are there potential problems with the use of static data?
There are sometimes, but there's nothing inherently wrong with this
code (you might consider using references instead, however). See
chapter 6 of _Modern C++ Design_ for more than you ever wanted to know
about singletons in C++
..
thanks, I keep on meaning to getting around to MCD, but I am not
comfortable with templates.
For instance something like this:-
class PerformanceData ItemIniFile : public PanelIniFile,
public Singleton< PerformanceData ItemIniFile >
...
worries me it inherits from something that uses itself as a parameter.
--
Nick Keighley
"Nick Keighley" <ni************ ******@hotmail. comwrote in message
news:11******** **************@ b68g2000cwa.goo glegroups.com
Hi,
I found this in code I was maintaining
template <class SingletonClass>
SingletonClass* Singleton<Singl etonClass>::ins tance ()
{
static SingletonClass _instance;
return &_instance;
}
there are indications that the constructor is getting called more than
once
in some circumstances (tracing in one of the instantiations of the
template).
Are there potential problems with the use of static data?
Compiler bugs aside, I think this could only be a problem with a
multi-threaded application. http://blogs.msdn.com/oldnewthing/ar.../08/85901.aspx
--
John Carson
Nick Keighley wrote:
mlimber wrote:
Nick Keighley wrote:
Hi,
>
I found this in code I was maintaining
>
template <class SingletonClass>
SingletonClass* Singleton<Singl etonClass>::ins tance ()
{
static SingletonClass _instance;
return &_instance;
}
>
there are indications that the constructor is getting called more than
once
in some circumstances (tracing in one of the instantiations of the
template).
>
Are there potential problems with the use of static data?
There are sometimes, but there's nothing inherently wrong with this
code (you might consider using references instead, however). See
chapter 6 of _Modern C++ Design_ for more than you ever wanted to know
about singletons in C++
.
thanks, I keep on meaning to getting around to MCD, but I am not
comfortable with templates.
You might want to try to look through at least chapter 6 because he
discusses some of the pitfalls with singletons in C++ (including in
multithreading, longevity, etc.) and ways to handle them.
For instance something like this:-
class PerformanceData ItemIniFile : public PanelIniFile,
public Singleton< PerformanceData ItemIniFile >
...
worries me it inherits from something that uses itself as a parameter.
That's the Curiously Recurring Template Pattern (see, e.g., http://en.wikipedia.org/wiki/Curious...mplate_Pattern) and
can be quite useful. However, with singletons, I would expect to see
something more like this for your template class:
template<class T>
class Singleton
{
public:
static T& Instance();
private:
// Disabled functions
Singleton();
Singleton( const Singleton& );
Singleton& operator=( const Singleton& );
Singleton* operator&();
~Singleton();
};
template<class T>
T& Singleton<T>::I nstance()
{
static T myObject;
return myObject;
}
Which is not inherited from but used as a wrapper like this:
class A
{
private:
// Private constructor/destructor disallows creation
// except by friends.
friend class Singleton<A>;
A();
~A();
// Disabled functions for singleton usage
A( const A& );
A& operator=( const A& );
A* operator&();
public:
void DoSomething();
// ...
};
Singleton<AtheA ;
void Foo()
{
theA::Instance( ).DoSomething() ;
}
Cheers! --M
Tilman Kuepper wrote:
Hi Nick,
there are indications that the constructor is getting called more
than once in some circumstances (tracing in one of the
instantiations of the template).
Are there potential problems with the use of static data?
I had exactly this problem when using Visual C++ 6.0. But only
in Release mode, not in Debug mode. Perhaps a problem with
the optimizer...?!
The solution was to move the implementation of the instance()
method from the .h to the .cpp file.
Hope it helps...
Tilman
Tilman Kuepper wrote:
Hi Nick,
there are indications that the constructor is getting called more
than once in some circumstances (tracing in one of the
instantiations of the template).
Are there potential problems with the use of static data?
I had exactly this problem when using Visual C++ 6.0. But only
in Release mode, not in Debug mode. Perhaps a problem with
the optimizer...?!
The solution was to move the implementation of the instance()
method from the .h to the .cpp file.
oops posted message with no additional text!
by a strange coincidence I'm using VCC 5 and the fault only occurs in
the
Release version...
--
Nick Keighley
Programming should never be boring, because anything
mundane and repetitive should be done by the computer.
~Alan Turing
Tilman Kuepper wrote:
Hi Nick,
there are indications that the constructor is getting called more
than once in some circumstances (tracing in one of the
instantiations of the template).
Are there potential problems with the use of static data?
I had exactly this problem when using Visual C++ 6.0. But only
in Release mode, not in Debug mode. Perhaps a problem with
the optimizer...?!
Possible but it seems more likely that this is symptomatic of other
latent problems. See "Surviving the Release Version" by Joseph M.
Newcomer: http://www.flounder.com/debug_release.htm
Particularly, this section: http://www.flounder.com/debug_releas...0Bugs%20(again)
The solution was to move the implementation of the instance()
method from the .h to the .cpp file.
That's generally a bad idea. Absent the export keyword, for
maintainability the function should be in the header. Duplicating it by
hand in every file that needs it is a maintenance nightmare. (I should
note that one of my compilers complained if I defined the Instance()
function given elsewhere in this thread inline in the class definition,
but moving it outside the class definition but still in the header file
quelled the complaint but kept maintenance the same.)
Cheers! --M
Tilman Kuepper wrote:
Hi Nick,
oops posted message with no additional text!
there are indications that the constructor is getting called more
than once in some circumstances (tracing in one of the
instantiations of the template).
Are there potential problems with the use of static data?
I had exactly this problem when using Visual C++ 6.0. But only
in Release mode, not in Debug mode. Perhaps a problem with
the optimizer...?!
by a strange coincidence I'm using VCC 5 and the fault only occurs in
the
Release version...
The solution was to move the implementation of the instance()
method from the .h to the .cpp file.
err, it's a template- doesn't it all have to go in the header file?
--
Nick Keighley
Programming should never be boring, because anything
mundane and repetitive should be done by the computer.
~Alan Turing This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Sean Dettrick |
last post by:
Hi,
apologies for yet another Singleton posting.
From reading around previous postings etc, I've cobbled together two
Singleton template definitions - one that returns a reference, and one
that returns a pointer. I understand the pointer one and it works,
but the reference one doesn't work as I expect. Can anybody explain
this to me? ...
|
by: Tim Clacy |
last post by:
Is there such a thing as a Singleton template that actually saves
programming effort?
Is it possible to actually use a template to make an arbitrary class a
singleton without having to:
a) explicitly make the arbitrary class's constructor and destructor private
b) declare the Singleton a friend of the arbitrary class
|
by: Chr?stian Rousselle |
last post by:
Hello,
I want to do derive a class from a Singleton template base class. Is
there a way to solve the following problem:
template<class T>
class CSingleton
{
public:
static T& GetInstance(void)
|
by: Jim Strathmeyer |
last post by:
So I'm trying to implement a singleton template class, but I'm getting a
confusing 'undefined reference' when it tries to link. Here's the code
and g++'s output. Any help?
// singleton.h
template <class T>
class Singleton : public T {
public:
static T * Instance();
|
by: Pelle Beckman |
last post by:
Hi,
I've done some progress in writing a rather simple
singleton template.
However, I need a smart way to pass constructor arguments
via the template.
I've been suggested reading "Modern C++ Design" or similar
books, but I feel there are full of clever guys here
who could help me out.
| |
by: MechSoft |
last post by:
Hi, there,
I have an issue about globally access data. My multi-threaded application
has some resources that need to be accessed by multiple threads and have the
lifetime of the application, such as the logging mechanism, various machine
statuses. I encapsulate them in different classes and use global objects
right now. As I look more into...
|
by: keepyourstupidspam |
last post by:
Hi,
I am wondering if My Singleton class is ok from a thread safety point
of view.
Am i adding the thread locks in the right places?
template <typename T>
class DLLEXPORT CSingleton
|
by: puzzlecracker |
last post by:
Will this function is singleton or do I need to declare a ctor in the
derived class as public, as well as copy-ctor and assignment
operator.
template<typename T>
class CSingleton
{
public:
static T& Instance()
{
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it. ...
| |
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes...
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
|
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...
| |