LINUX.ORG.RU
ФорумTalks

C++ такой C++


0

0

Создаём класс:

class A
{
private:
struct {
struct {
int x;
};
};
};

Пишем немного кода:

A a;
a.x = 42;
std::cout << a.x << std::endl;

Компилируем, выполняем, удивляемся.
UPD: подсказка: попробуйте ключ --pedantic



Последнее исправление: gest (всего исправлений: 2)
Ответ на: комментарий от Jetty

> Не совсем понятно где публичная секция начинается....

сразу от первого struct, в С++ принято, что после class идет сразу приватная, а после struct - публичная

lester ★★★★
()
Ответ на: комментарий от lester

А почему если один из struct убрать вылетает ошибка компиляции?

Rudcozt
()
Ответ на: комментарий от lester

Если я правильно понял, то тогда код должен работать и для такого класса:

class A
{
private:
struct {
int x;
};
};

?

gest
() автор топика

> Компилируем, выполняем, удивляемся.

gcc 4.2.1 и MSVC2005 проглотили. MSVC6 сказал, что cannot access private member. Занятно.

Relan ★★★★★
()
Ответ на: комментарий от gest

> Если я правильно понял, то тогда код должен работать и для такого класса:

тут и я затрудняюсь сказать, какая тут логика и есть ли она :) struct однозначно указывает на дефолтную публичность, а вот в каком порядке это все раскрывается - надо читать

lester ★★★★
()
Ответ на: комментарий от lester

нет, ну погодите, однако это внутри struct по дефалту паблик.

То есть

class A {
    int x;
};

A a = new A();
std::cout<<a.x<<std::endl;

должно выдавать при компиляции что не может обратиться к приватному полю. А

struct A {
    int x;
};

A a = new A();
std::cout<<a.x<<std::endl;

таких затруднений испытывать не должно. А как объяснить то что у топикстартера я не в курсе.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

вообще там анонимная структура, о чём и рассказывает ключ --pedantic. Но как они работают я не в курсе.

AndreyKl ★★★★★
()

Дядя Страуструп когда-то писал, что вложенных классов в C++ на самом деле нет. С тех пор что-то изменилось?

Xellos ★★★★★
()
Ответ на: комментарий от Xellos

т.е.

class A { 
  private:
    struct {
	struct {
	  int x; 
	};
    };
};
и
class A { 
  private:
    struct {
	int x; 
    };
};
эквивалентны :?

Jetty ★★★★★
()

Кто-нибудь может мне объяснить зачем внутри класса две вложенных, да и ещё и анонимных структуры?

Kosyak ★★★★
()
Ответ на: комментарий от Xellos

С тех пор что-то изменилось?

в 2003 вносились поправки касательно их области видимости, но стандарта под рукой у меня сейчас нет

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

> чтобы нескучно было

Дверь, яйца

политкорректность в переводах.

gunja
()

Ну тут похоже private относится к struct а не к x, именно к типу, а не полю. Попинайте кто-нибудь следующее:

class A{
public:
 class{
  class{
   int x;
  };
 };
};

SV0L0CH
()
Ответ на: комментарий от Xellos

структура без имени объявлена приватной, но поля составного класса будут такими как описаны в этой вложенной структуре. А в структуре всё публично поумолчанию.

SV0L0CH
()

Почему тема не в техническом разделе?

SV0L0CH
()
Ответ на: комментарий от SV0L0CH

Нет, я понимаю что такое защита данных. Методов. А что такое защита вложенных типов? Потомки не смогут объявлять данные этого типа?!

Xellos ★★★★★
()
Ответ на: комментарий от Xellos

Ну тип и так без имени, так что без разницы приватный он или публичный.

SV0L0CH
()
Ответ на: комментарий от jtootf

чтобы нескучно было

Причем фанатам утиной типизации. Вместо нормального человеческого наследования можно поизвращаться таким вот образом :)

balodja ★★★
()
Ответ на: комментарий от Xellos

Я не понимаю физического смысла.

Язык общего назначения же. Главное — рюшечки, а физический смысл найдется.

balodja ★★★
()
Ответ на: комментарий от k0l0b0k

linuxfan укатил домой. ему щас не до лора :))))))))))

yax123 ★★★★★
()
Ответ на: комментарий от Xellos

>защита вложенных типов

Наверное, когда они нужны для реализации хитрозавернутого класса и не нужны/не должны использоваться нигде больше.

Uter
()
Ответ на: комментарий от k0l0b0k

> C++ ненужное говно...

Вы очень правильно сказали. Язычок, в котором в стандарте сплошное «не определено по стандарту» можно смело отправлять в биореактор.

Bioreactor ★★★★★
()
Ответ на: комментарий от Bioreactor

>Вы очень правильно сказали. Язычок, в котором в стандарте сплошное «не определено по стандарту» можно смело отправлять в биореактор.

Лопнешь.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

> Лопнешь

не лопнет - хотя тенденции к «утолщению» у него есть

lester ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.