|
С++ Внутренний приватный класс | ☑ | ||
---|---|---|---|---|
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.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |