I'll try to explain what I want to do:
I have foo.h and foo.cpp. Units that include foo.h will define an
enumeration bar:
enum bar { typeNone, typeBaz, typeQuux, ... , count };
A method defined in foo.cpp needs to return typeNone. Is using
static_cast< bar >( 0 )
acceptable?
Also, methods in foo.cpp need to return typeBaz, typeQuux, etc. Is
there any way to specify that these are values of the bar enumeration
without actually defining bar (since units that include foo.h will
take care of that)?
--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cybers pace.org | don't, I need to know. Flames welcome. 21 1923
On 21/7/04 8:46 pm, in article cd**********@ch essie.cirr.com, "Christophe r
Benson-Manica" <at***@nospam.c yberspace.org> wrote: I'll try to explain what I want to do:
I have foo.h and foo.cpp. Units that include foo.h will define an enumeration bar:
enum bar { typeNone, typeBaz, typeQuux, ... , count };
A method defined in foo.cpp needs to return typeNone. Is using
static_cast< bar >( 0 )
acceptable?
Am I missing something obvious? Why not just return typeNone?
Also, methods in foo.cpp need to return typeBaz, typeQuux, etc. Is there any way to specify that these are values of the bar enumeration without actually defining bar (since units that include foo.h will take care of that)?
Is foo.cpp #including foo.h?
Steve.
On 21/7/04 8:50 pm, in article BD************* ****@127.0.0.1, "Steve"
<ro**@127.0.0.1 > wrote: On 21/7/04 8:46 pm, in article cd**********@ch essie.cirr.com, "Christophe r Benson-Manica" <at***@nospam.c yberspace.org> wrote:
I'll try to explain what I want to do:
I have foo.h and foo.cpp. Units that include foo.h will define an enumeration bar:
enum bar { typeNone, typeBaz, typeQuux, ... , count };
A method defined in foo.cpp needs to return typeNone. Is using
static_cast< bar >( 0 )
acceptable?
Am I missing something obvious? Why not just return typeNone?
Also, methods in foo.cpp need to return typeBaz, typeQuux, etc. Is there any way to specify that these are values of the bar enumeration without actually defining bar (since units that include foo.h will take care of that)?
Is foo.cpp #including foo.h?
Steve.
Oops, sorry, let me read the OP again more closely...
OK, let me rephrase my answer...
Why not put the enum declaration in foo.h?
Steve.
Steve <ro**@127.0.0.1 > spoke thus: Am I missing something obvious? Why not just return typeNone?
My intent is that neither foo.h nor foo.cpp will actually define bar,
perhaps something like
foo.h:
enum bar;
foo.cpp
#include "foo.h"
/* whatever
my_special_unit .cpp:
#include "foo.h"
enum bar { typeNone, typeBaz, count };
some_other_unit .cpp:
#include "foo.h"
enum bar { typeNone, typeQuux, typeCharlie, count };
Presumably this won't work, since the bar enumeration is never fleshed
out for foo.cpp. Basically, I want to make the symbols that the
enumeration will use available to foo.cpp without actually defining
the enumeration there. Does that make sense? Is it possible?
--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cybers pace.org | don't, I need to know. Flames welcome.
Christopher Benson-Manica wrote: Steve <ro**@127.0.0.1 > spoke thus:
Am I missing something obvious? Why not just return typeNone?
My intent is that neither foo.h nor foo.cpp will actually define bar, perhaps something like
foo.h:
enum bar;
foo.cpp
#include "foo.h"
/* whatever
my_special_unit .cpp:
#include "foo.h"
enum bar { typeNone, typeBaz, count };
some_other_unit .cpp:
#include "foo.h"
enum bar { typeNone, typeQuux, typeCharlie, count };
Presumably this won't work, since the bar enumeration is never fleshed out for foo.cpp. Basically, I want to make the symbols that the enumeration will use available to foo.cpp without actually defining the enumeration there. Does that make sense? Is it possible?
If you need to use the enum as a return type and the function must be
declared in the .h file (which is the case if I understood the original
question correctly) the answer is no. Only if the enum is used only
inside function in the .cpp file but never as return type or argument
the enum can be declared inside the .cpp file.
In case of a class you might consider putting the enum definition in the
private section of the class. That way it is clear that the enum is
intended for internal use only, and isn't accessible to the outside
world. Another advantage is that it is defined within the scope of the
class, so potential name clashes are avoided.
--
Peter van Merkerk
peter.van.merke rk(at)dse.nl
Peter van Merkerk <me*****@deadsp am.com> spoke thus: In case of a class you might consider putting the enum definition in the private section of the class. That way it is clear that the enum is intended for internal use only, and isn't accessible to the outside world. Another advantage is that it is defined within the scope of the class, so potential name clashes are avoided.
Well, here's another question: If I put the enum definition in the
class, can a subclass override that definition?
--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cybers pace.org | don't, I need to know. Flames welcome.
Without passing judgement on your design:
extern enum bar;
return bar(0);
-JKop
JKop <NU**@null.null > spoke thus: Without passing judgement on your design:
No, please do! Seriously - otherwise, how do I learn how to improve? :)
--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cybers pace.org | don't, I need to know. Flames welcome.
Christopher Benson-Manica posted: JKop <NU**@null.null > spoke thus:
Without passing judgement on your design:
No, please do! Seriously - otherwise, how do I learn how to improve? :)
First I'm going to talk about enums. They're pretty much useless. For
instance:
enum Month
{
Jan = 1,
Feb = 2,
Mar = 3,
Apr = 4,
May = 5,
Jun = 6,
Jul = 7,
Aug = 8,
Sep = 9,
Oct = 10,
Nov = 11,
Dec = 12
};
int main()
{
Month my_super_duper_ month(13);
}
So why are they useful? They're only merit is with switch statements:
switch (some_month)
{
case Jan:
//blah
case Feb:
//blah
}
The compiler can warn you when you leave one out of the switch statement.
Yipee!
Anyway, I'd suggest you return an "unsigned char" from this function. If you
want to give certain numbers special names, then by all means:
namespace ChocolateValues
{
const unsigned char no_error = 0;
const unsigned char multiple_errors = 1;
};
unsigned char SomeFunction()
{
return ChocolateValues ::no_error;
}
-JKop
JKop wrote: First I'm going to talk about enums. They're pretty much useless. For instance:
you have some serious misconceptions about enumerations.
enum Month { Jan = 1, Feb = 2, Mar = 3, Apr = 4, May = 5, Jun = 6, Jul = 7, Aug = 8, Sep = 9, Oct = 10, Nov = 11, Dec = 12 };
int main() { Month my_super_duper_ month(13); }
compiler error - illegal implicit conversion to int.
mind you:
Month m(static_cast<M onth>(13));
would work. but that is a case of directly and maliciously circumventing
the enumeration.
So why are they useful? They're only merit is with switch statements:
switch (some_month) { case Jan: //blah case Feb:
//blah
}
The compiler can warn you when you leave one out of the switch statement. Yipee!
what compiler? i would find it quite bizarre if a compiler barked that
warning at me, unless it had some crazy super verbose warning setting.
it is not an error, or even a mistake, to only switch on certain
enumerators.
Anyway, I'd suggest you return an "unsigned char" from this function. If you want to give certain numbers special names, then by all means:
namespace ChocolateValues { const unsigned char no_error = 0; const unsigned char multiple_errors = 1; };
unsigned char SomeFunction() { return ChocolateValues ::no_error; }
and this has to be the wackiest suggestion of all, considering that you
write off enums for having an implicit conversion to int above (which
they don't, as i pointed out).
in fact, the example above is LESS robust than if it had used enums.
consider this:
////////////////////////////////////////////////////////
namespace error {
const unsigned char no_error = 0;
const unsigned char out_of_memory = 1;
const unsigned char cannot_open_fil e = 2;
}
enum type {
no_error,
out_of_memory,
cannot_open_fil e
};
void print_error(uns igned char c) {
// print error message based on error code
switch (c) {
case error::no_error : // whatever
case error::out_of_m emory: // whatever
case error::cannot_o pen_file: // whatever
// ...
}
}
// nothing seems wrong with this...
unsigned char oops = 3;
// ...but
print_error(oop s); // <--- what should this do?
////////////////////////////////////////////////////////
as opposed to:
////////////////////////////////////////////////////////
namespace error {
enum type {
no_error,
out_of_memory,
cannot_open_fil e
};
}
void print_error(err or::type c) {
// print error message based on error code
switch (c) {
case error::no_error : // whatever
case error::out_of_m emory: // whatever
case error::cannot_o pen_file: // whatever
// ...
}
}
error::type nope = 3; // won't compile
// this is explicit and obvious - the programmer knew what (s)he
// was doing, and should be able to explain him/herself
error::type iffy = static_cast<err or::type>(3);
error::type ok = error::out_of_m emory; // obviously ok
////////////////////////////////////////////////////////
enumerations are not perfect - personally, i was looking for a better
solution just last week, and i was not satisfied with the options - but
until the standard committee gives the thumbs up to the new super enums,
we're stuck with them. despite all their shortcomings though, i'd have
to say they're still a better choice than simple ints (or unsigned
char's for that matter).
indi This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Joyce |
last post by:
In my schema I have 2 enumerations, let's say, country description and
country code, and I want to use them so I can map each country
description to its precise country code (and no other).
So far I've seen I can define both keys for description and code, but
my XMLs validate even if I choose a wrong pair:
Here are my both enumerations...
|
by: Plinkerton |
last post by:
I'm making an Base Class that will be inherited. In my base class, I
have a public enumeration that defines a list of things I want my class
to be able to do. I use it for Method input parameters, as well as
output Events.
Public Enum enmListOfValues
Value1
Value2
Value3
Value4
|
by: JoeH |
last post by:
Hi,
I'm using a COM DLL (created in VB) in my javascript code and can
successfully call its methods and get/set its properties. There are
also some Public enumerations defined in the ActiveX DLL I'd like to
access -- is this possible?
Thanks,
Joe
|
by: Seamus M |
last post by:
I can't find any info on enumerations in the PHP manual, so I assume there
is no built in way to create them. Can anyone tell me the best way to build
a simple enumeration, such as:
Enum AllItems as Integer
'First Item' = 1;
'Second Item' = 2;
:
End Enum
|
by: someone else |
last post by:
I have some code that creates dynamic enumerations for use in a PropertyGrid
control. This all works perfectly but the memory usage of the program
increases quite quicly when viewing the PropertyGrids displaying these
enumerations (one of which has a few hundred items in). I believe this is
because the dynamically generated enumerations are...
| |
by: Oleg Ogurok |
last post by:
Hi all,
I've added a new DataSet (xsd file) to my project in VS.NET 2003.
There I create a simple type as an enumeration of values.
<xs:simpleType name="MyCustomType">
<xs:restriction base="xs:string">
<xs:enumeration value="Apple" />
<xs:enumeration value="Orange" />
</xs:restriction>
|
by: ChrisB |
last post by:
Hello:
I will be creating 50+ enumerations related to a large number of classes
that span a number of namespaces. I was wondering if there are any "best
practices" when defining enumerations.
Should a single class be created that contains all of a solution's
enumerations? Or should enumerations be defined directly in the files that...
|
by: Ben Finney |
last post by:
Antoon Pardon wrote:
> I just downloaded your enum module for python
> and played a bit with it. IMO some of the behaviour makes it less
> usefull.
Feedback is appreciated. I'm hoping to provide a "one obvious way" to
do enumerations in Python.
> >>> from enum import Enum
> >>> day = Enum('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun')
|
by: Ben Finney |
last post by:
Howdy all,
PEP 354: Enumerations in Python has been accepted as a draft PEP. The
current version can be viewed online:
<URL:http://www.python.org/peps/pep-0354.html>
Here is the reStructuredText source as it is today. Please discuss it
here so I can see what issues people may have.
|
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: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
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...
| |