Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Use static after class definition? (http://www.velocityreviews.com/forums/t720202-use-static-after-class-definition.html)

Immortal Nephi 04-11-2010 12:38 AM

Use static after class definition?
 
I sometimes put static keyword after class definition. Is static
safe to use with iostream classes? I need to place it in the function
body. The string in the function body stays in memory for lifetime
until program terminates.

enum Ereport_Behavior
{
eEnter,
eTrace,
eExit
};

void Trace( const Ereport_Behavior eReport_Behavior,
const string strText )
{
static ostringstream ossText;

if( eReport_Behavior == eEnter )
{
ossText.str( “” );
ossText << “Entering…\n”;
}
else if( eReport_Behavior == eTrace )
ossText << strText;
else if( eReport_Behavior == eExit )
{
ossText << “Exiting…\n\n”;
cout << ossText.str();
}
}

int main()
{
Trace( eEnter, “” );
Trace( eTrace, “Testing Trace()…” );
Trace( eExit, “” );

Return 0;
}

Ian Collins 04-11-2010 12:55 AM

Re: Use static after class definition?
 
On 04/11/10 12:38 PM, Immortal Nephi wrote:
> I sometimes put static keyword after class definition. Is static
> safe to use with iostream classes? I need to place it in the function
> body. The string in the function body stays in memory for lifetime
> until program terminates.


Your terminology is a bit of a muddle, but yes, you can have a static
stream object in a function.

--
Ian Collins

James Kanze 04-11-2010 12:33 PM

Re: Use static after class definition?
 
On Apr 11, 1:55 am, Ian Collins <ian-n...@hotmail.com> wrote:
> On 04/11/10 12:38 PM, Immortal Nephi wrote:


> > I sometimes put static keyword after class definition. Is
> > static safe to use with iostream classes? I need to place
> > it in the function body. The string in the function body
> > stays in memory for lifetime until program terminates.


> Your terminology is a bit of a muddle, but yes, you can have a
> static stream object in a function.


More than a bit. You can also use static after a class
definition, e.g.:

class Toto
{
// ...
} static x;

But you can't provide a class definition for std::ostream, for
example, because it's already defined.

Also, C has deprecated placing static in this place: if a
storage class specifier is present, it should come first, e.g.:

static std::ofstream log("toto.log");

I would consider it good form in C++ to follow these rules as
well.

--
James Kanze

Immortal Nephi 04-11-2010 03:24 PM

Re: Use static after class definition?
 
On Apr 11, 7:33*am, James Kanze <james.ka...@gmail.com> wrote:
> On Apr 11, 1:55 am, Ian Collins <ian-n...@hotmail.com> wrote:
>
> > On 04/11/10 12:38 PM, Immortal Nephi wrote:
> > > I sometimes put static keyword after class definition. *Is
> > > static safe to use with iostream classes? *I need to place
> > > it in the function body. *The string in the function body
> > > stays in memory for lifetime until program terminates.

> > Your terminology is a bit of a muddle, but yes, you can have a
> > static stream object in a function.

>
> More than a bit. *You can also use static after a class
> definition, e.g.:
>
> * * class Toto
> * * {
> * * * * // *...
> * * } static x;
>
> But you can't provide a class definition for std::ostream, for
> example, because it's already defined.
>
> Also, C has deprecated placing static in this place: if a
> storage class specifier is present, it should come first, e.g.:
>
> * * static std::ofstream log("toto.log");
>
> I would consider it good form in C++ to follow these rules as
> well.


Trace function in my example is not a bit of muddle. I find some
ways to add more flexibility. My code sounds like non-standard
debugging report, but programmers easily understand my code when they
examine class definition.
James tells good example to add static to ofstream log. I think that
he means to place it in the global scope or outside class definition
in file scope.
I want to add wrapper to class log. I place ofstream log in the
class log body. I will use ofstream log when I want to write trace
message to the file each line. Sometimes, I want to store trace
message to static ostringstream log in the function body. If eExit
( enum variable ) is set to true condition, then all trace message
lines stored in static ostringstream log will be displayed in the
window MessageBox.
The function looks like

Trace( var < 10, “The value: var “ << var << “ must be less than “ <<
var2 << “.\n” ).

Notice operator << is placed in the function parameter. Sounds like
invalid C++ rules? It is not a function, but it is a macro.

#define Mtrace( expr, message ) \
Trace( expr, message )

I use prefix Hungarian notation and I can identify which is real
function or macro. Very simple. A bit of muddle is rare.


All times are GMT. The time now is 10:02 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57