Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c++ > #4449 > unrolled thread
| Started by | Saeed Amrollahi <amrollahi.saeed@gmail.com> |
|---|---|
| First post | 2011-04-30 06:58 -0700 |
| Last post | 2011-05-01 12:57 +0800 |
| Articles | 4 — 2 participants |
Back to article view | Back to comp.lang.c++
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: Is it standard that inner class inherits the outer class' friendship? Saeed Amrollahi <amrollahi.saeed@gmail.com> - 2011-04-30 06:58 -0700
Re: Is it standard that inner class inherits the outer class' friendship? Qi <no@no.com> - 2011-04-30 22:08 +0800
Re: Is it standard that inner class inherits the outer class' friendship? Saeed Amrollahi <amrollahi.saeed@gmail.com> - 2011-04-30 12:37 -0700
Re: Is it standard that inner class inherits the outer class' friendship? Qi <no@no.com> - 2011-05-01 12:57 +0800
| From | Saeed Amrollahi <amrollahi.saeed@gmail.com> |
|---|---|
| Date | 2011-04-30 06:58 -0700 |
| Subject | Re: Is it standard that inner class inherits the outer class' friendship? |
| Message-ID | <41dd0896-2e1b-4c2f-8d05-9b4b74e3c787@p13g2000yqh.googlegroups.com> |
On Apr 30, 1:06 pm, Qi <n...@no.com> wrote:
> Below code, indeed I found here,http://bytes.com/topic/c/answers/523273-inner-classes-friend
> I changed it a bit to make it compilable and simpler.
>
> The code can be compiled on both VC 2008 Express and GCC 4.5.2
>
> That implies that
> "An inner class can inherit its outer class' friendship".
> My question is if that implication correct?
>
> I doubt that because,
> 1, The link I showed above seems approved that's wrong.
> Though that was posted in 2006.
> 2, As far as I understand, a derived class doesn't inherit
> its base class' friendship. B is F's friend, D is derived from
> B, D is not F's friend by default. (am I correct?)
>
> Can any one give some summary on the friendship inheritance
> of inner and outer classes, base and derived classes that defined
> by the standard?
>
> Thanks
>
> ===CODE===
>
> class Node {
> private:
> int value;
>
> friend class Graph;
>
> };
>
> class Graph {
> private:
> class cmp {
> public:
> int operator()(const Node &l, const Node &r) {
> return (l.value - r.value); // without that friend, this
> line can't compile
> }
> };
>
> };
>
> --
> WQ
Hello
1. At first, I have to say the terms "inner class" and "outer class"
aren't standard. It's somehow Java terms. C++ uses "nested class".
2. About your code, By the term "inner class", if you mean "nested
class",
you didn't use it. You have two classes: Node and Graph and you
declared
Graph as a friend of Node. May be, by inner you mean the logical
inner,
because each node of a graph is somehow the inner part of whole graph.
3. Yes. You are right. friendship isn't inherited, transitive, or
reciprocal.
Please see the following link:
http://www.parashift.com/c++-faq-lite/friends.html#faq-14.4
Also for standard wording, see section 11.3 of
N3290- Final Draft of International Standard.
HTH,
-- Saeed Amrollahi
[toc] | [next] | [standalone]
| From | Qi <no@no.com> |
|---|---|
| Date | 2011-04-30 22:08 +0800 |
| Message-ID | <iph578$qf9$2@speranza.aioe.org> |
| In reply to | #4449 |
On 2011-4-30 21:58, Saeed Amrollahi wrote:
>> class Graph {
>> private:
>> class cmp {
>> public:
>> int operator()(const Node&l, const Node&r) {
>> return (l.value - r.value); // without that friend, this
>> line can't compile
>> }
>> };
>>
>> };
>>
> 1. At first, I have to say the terms "inner class" and "outer class"
> aren't standard. It's somehow Java terms. C++ uses "nested class".
> 2. About your code, By the term "inner class", if you mean "nested
> class",
> you didn't use it. You have two classes: Node and Graph and you
> declared
> Graph as a friend of Node. May be, by inner you mean the logical
> inner,
> because each node of a graph is somehow the inner part of whole graph.
Thanks for the reply and sorry for the misunderstand.
For nested class (OK, now I will use this term, but then what's the
equivalence of "outer class"?), I mean Graph::cmp.
Sorry for any misunderstand.
--
WQ
[toc] | [prev] | [next] | [standalone]
| From | Saeed Amrollahi <amrollahi.saeed@gmail.com> |
|---|---|
| Date | 2011-04-30 12:37 -0700 |
| Message-ID | <daa72e8b-bf71-43a8-bb10-c5c66621c637@z7g2000prh.googlegroups.com> |
| In reply to | #4451 |
On Apr 30, 6:08 pm, Qi <n...@no.com> wrote:
> On 2011-4-30 21:58, Saeed Amrollahi wrote:
>
>
>
> >> class Graph {
> >> private:
> >> class cmp {
> >> public:
> >> int operator()(const Node&l, const Node&r) {
> >> return (l.value - r.value); // without that friend, this
> >> line can't compile
> >> }
> >> };
>
> >> };
>
> > 1. At first, I have to say the terms "inner class" and "outer class"
> > aren't standard. It's somehow Java terms. C++ uses "nested class".
> > 2. About your code, By the term "inner class", if you mean "nested
> > class",
> > you didn't use it. You have two classes: Node and Graph and you
> > declared
> > Graph as a friend of Node. May be, by inner you mean the logical
> > inner,
> > because each node of a graph is somehow the inner part of whole graph.
>
> Thanks for the reply and sorry for the misunderstand.
> For nested class (OK, now I will use this term, but then what's the
> equivalence of "outer class"?), I mean Graph::cmp.
>
> Sorry for any misunderstand.
>
> --
> WQ
Hi
I'm sorry too, because, I didn't pay attention to
nested class Graph::cmp.
As I mentioned in section 11.3 at paragraph 2, there is wording:
"Declaring a class to be a friend implies that the names of
private and protected members from the class granting friendship
can be accessed in the base-specifiers and member declarations of
the befriended class."
In your case:
If you declare class Graph a friend of class Node, the private
names of class Node (the class granting friendship) can be accessed
in nested class cmp of the befriending class (Graph).
BTW, I can't find a standard terminology for "Outer class",
but in standard document, there is an example using "enclose" as
class name.
HTH,
-- Saeed Amrollahi
[toc] | [prev] | [next] | [standalone]
| From | Qi <no@no.com> |
|---|---|
| Date | 2011-05-01 12:57 +0800 |
| Message-ID | <ipipb4$ntp$1@speranza.aioe.org> |
| In reply to | #4531 |
On 2011-5-1 3:37, Saeed Amrollahi wrote: > As I mentioned in section 11.3 at paragraph 2, there is wording: > "Declaring a class to be a friend implies that the names of > private and protected members from the class granting friendship > can be accessed in the base-specifiers and member declarations of > the befriended class." > In your case: > If you declare class Graph a friend of class Node, the private > names of class Node (the class granting friendship) can be accessed > in nested class cmp of the befriending class (Graph). Thanks, that explained my problem. -- WQ
[toc] | [prev] | [standalone]
Back to top | Article view | comp.lang.c++
csiph-web