Victor Bazarov wrote:
Quote:
Adrian Hawryluk wrote:
Quote:
>Can one define a partial class (first part containing constants like
>enums) and then define the rest of the class elsewhere?
>
No.
Yeah, I figured as much.
Quote:
Quote:
>The only way I see around this are:
>1. Declare a public base class for B that contains the enums. It is
> not dependent on A so no problem occurs. It would be declared
> with the class B stub;
>
That's the best solution, IMO.
Hmmm.
Phlip wrote:
Quote:
What's the real problem you need to solve; the problem that lead you
to this attempted solution?
The problem has occurred many times now. I'm not a newbie to C++, I've
been programming in it for 10 years now. I was just wondering if
anybody had another idea.
Quote:
Google "premature optimization". Always go for the cleanest design
first, regardless of optimization. It's easier to make beautiful code
fast than fast code beautiful.
>
And in this specific case, C++ can optimize that stub size away.
Yeah, I know. Trouble is, there are compilers that f*** it up slowing
down certain apps because of it. I'm not optimising prematurely, as
I've said, I've been doing this for years.
Quote:
Quote:
>2. Enum is not scoped to a class.
>
So what? What's the worst thing that could happen if some plebe class
gets its dirty hands on that enum?
Wrong, that is probably closer to the best case, the worst case is you
get a name clash. And don't tell me about namespaces, it is OT from my
original question. I just want to keep the enum in place where it is used.
Quote:
Quote:
>3. A bit overkill if it does work.
>
Faux template classes are where it's at. Declare the enum somewhere,
and template them into your target class.
Oh yeah, this also exposes the code, not what I want.
Quote:
In you unit tests, you can create different enums to test the
template. (You do _have_ unit tests, don't you?)
I didn't come here to be insulted, just ask a question. Lol.
Piyo wrote:
Quote:
BTW, your class B is not dependent on class
A at all. (A is dependent on B though) based on
this example code.
Sorry, is this better?
<header file="A.h">
#if !defined A_H
# define A_H
// Stub for forward referencing
class A;
# include “B.h”
class A
{
// Interface functions
void f(B* b, B::b_e enums);
...
};
#endif
</header>
<header file="B.h">
#if !defined B_H
# define B_H
// Stub for forward referencing
class B;
# include “A.h”
class B
{
public:
enum b_e { enum1, enum2 };
void f(A* a); ///< here is the dependent
// Interface functions
...
};
#endif
</header>
Quote:
Can you describe your problem or post actual code that
demonstrates your need for partial class declarations?
As for the actual example, it would be too long and have lots of extra
non-relevant stuff, but trust me it does occur and has occurred at other
times before that.
One case would be in a Mediator pattern when a mediator 'A' requires the
ids from a mediator 'B' to access B's objects indirectly through B.
If the base class is the only solution that can be thought up, then so
be it.
Adrian
--
================================================== ========
Adrian Hawryluk BSc. Computer Science
----------------------------------------------------------
Specialising in: OOD Methodologies in UML
OOP Methodologies in C, C++ and more
RT Embedded Programming
__--------------------------------------------------__
----- [blog:
http://adrians-musings.blogspot.com/] -----
'--------------------------------------------------------'
My newsgroup writings are licensed under the Creative
Commons Attribution-Noncommercial-Share Alike 3.0 License
http://creativecommons.org/licenses/by-nc-sa/3.0/
================================================== ========