Имя: Пароль:
IT
 
С++ Внутренний приватный класс
0 НафНаф
 
13.03.13
12:40
имеем следующие классы:

class X
{
private:
   class InnerX
   {
   public:
       void InnerTest()
       {
       }
   };
public:
   InnerX* Test()
   {
       return new InnerX();
   }
};

работаем с ними:

   X* x = new X();
   X::InnerX* ix = x->Test(); //естественно валимся в ошибку недоступности класса
   ix->InnerTest();

однако вот так, работает:

   X* x = new X();
   x->Test()->InnerTest();

вопрос: почему?
1 zak555
 
13.03.13
12:42
нельзя было сделать наследование ?
2 НафНаф
 
13.03.13
12:42
(1) причем тут наследование?
3 НафНаф
 
13.03.13
13:00
Проверил в C# - там вообще невозможно вернуть тип меньшей видимости, чем у метода
4 acsent
 
13.03.13
13:04
зачем такой огород городить и пытаться понять почему оно так????
5 НафНаф
 
13.03.13
13:06
(4) разрабатывается своя система, со своими конструкциями
хочется понять, допустимы ли такие выкрутасы с вложенностью типов
теперь становится понятно , что нет - это не правильно
6 spock
 
13.03.13
18:37
(0)
standart for programming language c++
9.7 nested class declaration
A class can be declared within another class. A class declared within another is called a nested class. The
name of a nested class (!!!)is local to its enclosing class(!!). The nested class is in the scope of its enclosing class(!!!!!).
7 zak555
 
13.03.13
18:38
(6) тут по-русски пишут
8 spock
 
13.03.13
18:46
(7)не осилил чтоли?
9 Steel_Wheel
 
13.03.13
18:50
(8) по F1 на таком же языке пишут ))
10 НафНаф
 
13.03.13
19:31
(6) сенкс, в шарпе таки, имхо, сделали более по-фэншую
11 spock
 
14.03.13
06:41
(10)покажи. Мне интересно.
12 НафНаф
 
14.03.13
06:43
(11) что тебе показать, см (3)
синтакс ошибка: метод возвращает внутренний тип с меньшим уровнем видимости
13 spock
 
14.03.13
06:46
(12)так в сях "почти" таже самая ошибка выдаваться будет.
14 spock
 
14.03.13
06:47
(12)показать то, как вложенный класс в шарпе можно было бы использовать.
15 НафНаф
 
14.03.13
06:58
(13) в (0) вторая часть ее нет
(14) забубень
16 sda553
 
14.03.13
07:13
(0) Тот код который валиться, он где? Если вне объявлений класса X,  то как он может быть доступен?

А вообще давай по частям.
X* x = new X();
  X::InnerX* ix;
Так ошибки нет?
17 НафНаф
 
14.03.13
11:14
(16) конечно есть
воппрос вообще то решен, C# более правильно себя ведет
18 sikuda
 
14.03.13
11:23
(17) Я фигею от таких людей. "Общий стандарт языка ведет себя не правильно, а конкретная коммерческая реализация более правильно". Вы запуталсь, батенька с теплым и мягким!
19 НафНаф
 
14.03.13
11:26
(18) кто запутался? ты в курсе что это вообще два разных языка?
и кстати С# документирован настолько, что у него нет (я не знаю таких) неопределенного поведения как в C++
20 spock
 
14.03.13
11:32
(15) не понял про забубень.
21 НафНаф
 
14.03.13
11:34
(20) не правильно тебя понял, в шарпе ругается уже на стадии

public InnerX Test() //<--- нельзя возвращать тип видимость которого ниже, чем у метода
  {
      return new InnerX();
  }
22 sikuda
 
14.03.13
11:36
Так я тебе и толкую об этом. C# един, реализация одна - коммерческая. С++ это язык у которого принялись несколько стандартов общих 03, 11 не помню точно. Когда ты говоришь о результатах, надо обязательно говорить какой фирмой сделан компилятор, какой версии и т.д. И глубина проблемы возрастает на порядок.
Я тебе об этом и говорю, что проще применить С# или 1С. Быстрее получишь результат. А С++ надо разбираться и разбираться глубоко.
Поэтому и говорю что путаешь мягкое и теплым...
23 НафНаф
 
14.03.13
11:39
(22) ничего я не путаю, я понимаю что C++ стандартизирован плохо
кстати надо проверить, является ли проприетарной лицензия на использование C#
24 HeroShima
 
14.03.13
13:25
У С# тоже несколько версий.
И мне непонятно зачем так сильно хотеть прострелить себе ногу.
25 НафНаф
 
14.03.13
14:42
(24) см (5)
26 orefkov
 
14.03.13
15:05
(0)
Имхо все правильно себя С++ ведет.

X* x = new X();
X::InnerX* ix = x->Test(); //естественно валимся в ошибку недоступности класса

Ошибка здесь возникает не в "x->Test()" - это метод как-раз публичный, а в "X::InnerX* ix" - объявлении переменной закрытого типа.

А вот в
  x->Test()->InnerTest();

переменную закрытого типа ты не объявляешь, а просто вызываешь два публичных метода.
27 НафНаф
 
14.03.13
15:11
(26) однако C# такую вольность не допускает, и я с ним согласен больше чем с С++
28 orefkov
 
14.03.13
15:18
(27)
Ну это уже вопрос религии - с чем больше соглашаться.
Я тут с С++ согласен.
Хотя если точно, пунктов стандарта на этот счет не знаю, и вполне возможно, что это косяк конкретного компилятора.
На нескольких компиляторах проверял код?
29 НафНаф
 
14.03.13
15:23
(28) на одном gcc
30 НафНаф
 
14.03.13
15:24
+(29) если точнее mingw
31 badboychik
 
14.03.13
15:24
(23) сам компилятор C# бесплатный, лицензия нужна только на visual studio.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс