Re: Partial classes
Victor Bazarov wrote:
> Adrian Hawryluk wrote:
>> 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.
>> 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:
> 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.
> 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.
>> 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.
>> 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.
> 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:
> 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>
> 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/
==========================================================