Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #4449 > unrolled thread

Re: Is it standard that inner class inherits the outer class' friendship?

Started bySaeed Amrollahi <amrollahi.saeed@gmail.com>
First post2011-04-30 06:58 -0700
Last post2011-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.


Contents

  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

#4449 — Re: Is it standard that inner class inherits the outer class' friendship?

FromSaeed Amrollahi <amrollahi.saeed@gmail.com>
Date2011-04-30 06:58 -0700
SubjectRe: 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]


#4451

FromQi <no@no.com>
Date2011-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]


#4531

FromSaeed Amrollahi <amrollahi.saeed@gmail.com>
Date2011-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]


#4541

FromQi <no@no.com>
Date2011-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