473,231 Members | 2,915 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,231 software developers and data experts.

using std::string; string("hello") vs std::string("hello") in header file.

In Accellerated C++, the author recommends that in a header file one should
not declare
using std::string, using std::vector etc instead one should directly specify
the namespace specifier in code.

for example, this is bad practice:

header.h
#include <string>
using std::string;
class a{
string x;
};

instead, one should write:
#include <string>
class a{
std::string x;
};

The reason given by the author is that 'using std::string' actually pollutes
the scope where 'using std::string' is declared.
I find this style is rather inconvenient when I want to experiment with
different implementation of certain classes in large projects. For example,
I may want to try myns::string or john::string, it's actually much easier to
replace 'using std::string' to 'using myns::string' and instantly switch to
another string implementation. This is much better than going through all
the instances of 'std::string variable' and replace them to 'myns::string
variable'.

What are your thoughts on this coding style?
Mar 30 '06 #1
9 3713
Fei Liu wrote:
In Accellerated C++, the author recommends that in a header file one
should
not declare
using std::string, using std::vector etc instead one should directly
specify
the namespace specifier in code.
Doesn't it say "at top level"?
The reason given by the author is that 'using std::string' actually
pollutes
the scope where 'using std::string' is declared.
I find this style is rather inconvenient when I want to experiment with
different implementation of certain classes in large projects. For
example,
I may want to try myns::string or john::string, it's actually much easier
to
replace 'using std::string' to 'using myns::string' and instantly switch
to
another string implementation. This is much better than going through all
the instances of 'std::string variable' and replace them to 'myns::string
variable'.

What are your thoughts on this coding style?


In general, write a friggin "using std::string;" wherever you like, in fresh
code where nothing is called "string" except the std:: class.

The guideline is to never put anything in a .h file that could cause trouble
in any .cpp file that includes it. This rule implies the area outside a
class{} or namespace{} block should be reserved for things that absolutely
must go there, and convenient things like typedef or using are more trouble
than this minor convenience.

In your case, you could write this in a header:

namespace zone {
// using john::string;
using myns::string;
}

Now use zone::string everywhere you would have used std::string.

(And please don't let us think you are redefining 'string' for your own
nefarious purposes! Leave the std:: classes alone!!)

--
Phlip
http://www.greencheese.org/ZeekLand <-- NOT a blog!!!
Mar 30 '06 #2

"Phlip" <ph******@yahoo.com> wrote in message
news:59*******************@newssvr30.news.prodigy. com...
Fei Liu wrote:
In Accellerated C++, the author recommends that in a header file one
should
not declare
using std::string, using std::vector etc instead one should directly
specify
the namespace specifier in code.
Doesn't it say "at top level"?


I'll double check that tomorrow when I get a hold of the book again.
The reason given by the author is that 'using std::string' actually
pollutes
the scope where 'using std::string' is declared.
I find this style is rather inconvenient when I want to experiment with
different implementation of certain classes in large projects. For
example,
I may want to try myns::string or john::string, it's actually much easier to
replace 'using std::string' to 'using myns::string' and instantly switch
to
another string implementation. This is much better than going through all the instances of 'std::string variable' and replace them to 'myns::string variable'.

What are your thoughts on this coding style?
In general, write a friggin "using std::string;" wherever you like, in

fresh code where nothing is called "string" except the std:: class.

The guideline is to never put anything in a .h file that could cause trouble in any .cpp file that includes it. This rule implies the area outside a
class{} or namespace{} block should be reserved for things that absolutely
must go there, and convenient things like typedef or using are more trouble than this minor convenience.

In your case, you could write this in a header:

namespace zone {
// using john::string;
using myns::string;
}

Now use zone::string everywhere you would have used std::string.
This is a good technique, thanks!

(And please don't let us think you are redefining 'string' for your own
nefarious purposes! Leave the std:: classes alone!!)


Think what you will, but I can assure you that redefining 'string' for a C++
programmer is like taking the first step for a baby. It has to be done
sooner or later. :)
Mar 30 '06 #3
> The guideline is to never put anything in a .h file that could cause
trouble in any .cpp file that includes it.
What kind of trouble? Consider Noah Roberts's recent charming post "Gotta
love it":
DComponent(const DComponent & copy) : DGenericNode(copy) {}

c:\src\PIPE-FLO 32\DComponent.h(12) : error C2065: 'copy' : undeclared
identifier
c:\src\PIPE-FLO 32\DComponent.h(12) : fatal error C1903: unable to
recover from previous error(s); stopping compilation


Of course we will never know exactly where that error came from. (And just
saying "get a less crappy compiler" is less a useful engineering tip than a
cheap shot at M$.)

It resembles the kinds of bugs that VC++ has regarding namespaces,
regardless whether Noah abused his directly. Even if your code is
syntactically correct, avoiding namespace abuse will reduce the odds of
these kinds of bugs, whether they are your fault's or the compiler's.

--
Phlip
http://www.greencheese.org/ZeekLand <-- NOT a blog!!!
Mar 30 '06 #4
Fei Liu wrote:
Think what you will, but I can assure you that redefining 'string' for a
C++
programmer is like taking the first step for a baby. It has to be done
sooner or later. :)


Just so we remain on the same page here, "redefining 'string'" could mean
any one of these:

1. write your own string class as an exercise
2. rebuild std::basic_string<> from scratch
3. build an alternative app-specific XString class

Two of those items are attrocities that shouldn't ever be done for any
reason. Even if you need a string for an application-specific evil character
set, such as an EBCDIC/UTF-7 hybrid or something, you can still provide a
custom type for basic_string<>.

--
Phlip
http://www.greencheese.org/ZeekLand <-- NOT a blog!!!

Mar 30 '06 #5

"Phlip" <ph******@yahoo.com> wrote in message
news:TP*****************@newssvr33.news.prodigy.co m...
Fei Liu wrote:
Think what you will, but I can assure you that redefining 'string' for a
C++
programmer is like taking the first step for a baby. It has to be done
sooner or later. :)


Just so we remain on the same page here, "redefining 'string'" could mean
any one of these:

1. write your own string class as an exercise
2. rebuild std::basic_string<> from scratch
3. build an alternative app-specific XString class

Two of those items are attrocities that shouldn't ever be done for any
reason. Even if you need a string for an application-specific evil

character

There are reasons why a different string implementation would be required.
It all depends. std::string is a general string implementation that fits
some (general) cases very well. But to meet specific requirement, be it
performance, memory management etc, often than not a different domain
specific string implementation is used.

Thanks for your feedback.
Mar 31 '06 #6
Fei Liu wrote:
In Accellerated C++, the author recommends that in a header file one should
not declare
using std::string, using std::vector etc instead one should directly specify
the namespace specifier in code.

for example, this is bad practice:

header.h
#include <string>
using std::string;
class a{
string x;
};

instead, one should write:
#include <string>
class a{
std::string x;
};

The reason given by the author is that 'using std::string' actually pollutes
the scope where 'using std::string' is declared.
I find this style is rather inconvenient when I want to experiment with
different implementation of certain classes in large projects. For example,
I may want to try myns::string or john::string, it's actually much easier to
replace 'using std::string' to 'using myns::string' and instantly switch to
another string implementation. This is much better than going through all
the instances of 'std::string variable' and replace them to 'myns::string
variable'.

What are your thoughts on this coding style?


If you want to experiment, it's much easier if you just create a
typedef, and then change the typedef when you want to change it
throughout your code.

Mar 31 '06 #7
Fei Liu wrote:
There are reasons why a different string implementation would be required.
It all depends. std::string is a general string implementation that fits
some (general) cases very well. But to meet specific requirement, be it
performance, memory management etc, often than not a different domain
specific string implementation is used.


I challenge all "build don't buy" decisions.

But in the specific case of a string, I have worked in linguistics, CORBA,
ActiveX, object databases, video games, embedded stuff, and chat servers,
and I have _never_ seen a situation that needs an application-specific
string class.

I have, however, seen plenty of custom string classes. They added no value,
and slowed down development. And their authors often held them for ransom.

--
Phlip
http://www.greencheese.org/ZeekLand <-- NOT a blog!!!
Mar 31 '06 #8
Phlip wrote:
Fei Liu wrote:

There are reasons why a different string implementation would be required.
It all depends. std::string is a general string implementation that fits
some (general) cases very well. But to meet specific requirement, be it
performance, memory management etc, often than not a different domain
specific string implementation is used.

I challenge all "build don't buy" decisions.

But in the specific case of a string, I have worked in linguistics, CORBA,
ActiveX, object databases, video games, embedded stuff, and chat servers,
and I have _never_ seen a situation that needs an application-specific
string class.

I have, however, seen plenty of custom string classes. They added no value,
and slowed down development. And their authors often held them for ransom.


What about a thread-safe string class?

Joe
Apr 1 '06 #9
Joe Van Dyk wrote:
I have, however, seen plenty of custom string classes. They added no value,
and slowed down development. And their authors often held them for ransom.


What about a thread-safe string class?


If your std::string class does COW then I would hope it does atomic,
lock-free reference-counting which will correctly hide the fact
internal data sharing is occuring; if it does not, then it already is
thread safe. Of course, that doesn't mean you can't do non-thread-safe
things with a string class -- for example, as with any object that is
shared between threads, a global std::string object that might get
written from multiple threads should have a mutex (or similar) to make
it safe. But you wouldn't want to add that overhead to all std::string
objects, would you?

--
Richard Smith

Apr 1 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

23
by: Hans | last post by:
Hello, Why all C/C++ guys write: const char* str = "Hello"; or const char str = "Hello";
42
by: Prashanth Badabagni | last post by:
Hi, Can any body tell me how to print "hello,world" with out using semicolon Thanks in advance .. Bye Prashanth Badabagni
7
by: Dan H. | last post by:
Hello, What is the equivalent "string resource file" in c#? And, is there a way to create a beep in C#? Thanks, Dan
3
by: RobertoPerez | last post by:
We have a default "Hello World" web services that we can call from VC++ creating an unmanaged DLL. The DLL is used in old languages that calls the DLL-function and that is calling the web sevice....
16
by: ondekoza | last post by:
Hello, I need to convert the string "FFFFFFFF" to a long. To convert this string I tried the following: >>> 0xffffffff -1 >>> 0xffffffffL 4294967295L OK, this is what I want, so I tried
6
by: Georg J. Stach | last post by:
Hello, taken I've declared an enumeration like this: enum Color{ red,green,blue }; The internal representation of Color is of type integer and it's no problem to print out their values. ...
3
by: lovecreatesbeauty | last post by:
Both `K&R C, 2nd' and `C: A reference manual, 5th' introduce the "hello, world" thing using the name "string-constant". But `ISO/IEC 9899:TC2' does not include this kind of thing in section `A.1.5...
10
by: fei.liu | last post by:
Consider the following sample code char * ptr = "hello"; char carray = "hello"; int main(void){ } What does the standard have to say about the storage requirement about ptr and carray? Is...
4
by: arnuld | last post by:
i am learning C and doing the exercise 1-1 of K&R2, where K&R ask to remove some parts of programme and experiment with error, so here i go: #include <stdio.h> int main () { printf('hello...
0
by: VivesProcSPL | last post by:
Obviously, one of the original purposes of SQL is to make data query processing easy. The language uses many English-like terms and syntax in an effort to make it easy to learn, particularly for...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.