LINUX.ORG.RU

Злобный G++


0

0

Почему gcc требует public для A::A(), ведь в данном примере A::A() не используется вообще?

$ cat opyt.cpp
#include <iostream>

using namespace std;

class A
{
    public:
        A( int i ) { cout << "A::A( int )" << endl; }

    private:
        A() { cout << "A::A()" << endl; }
};

class B
{
    public:
        A a;
        B( int i ) : a(i) {}

    private:
        B(){}
};

int main()
{
    B b(1);
    return 0;
}

$ g++ -g opyt.cpp
opyt.cpp: In constructor 'B::B()':
opyt.cpp:20: error: 'A::A()' is private
opyt.cpp:30: error: within this context

P.S. Почему после неудачного добавления сообщения "Preformatet text" перескакивает на "TeX paragraph"?

>   private:
>        B(){}

Зачем тебе это? Убери бяку. В ней происходит вызов конструктора по умолчанию A::A(). Неужели непонятно?

GCC тут прав, а ты нет.


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

Хм, действительно... Спасибо.

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

> A a;

используется здесь. A::A() - дефолтный конструктор, а ты его в приват запихал. ССЗБ.

anonymous
()

class B
{
public:
A a;
B( int i ) : a(i) {}

private:
B(): a(0) {} // Можно так
};

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

> А вот это тогда что?

Это декларация переменой a типа A член класса B.

Но при инстанировании класса B используется конструктор с параметром в котором также указано что при инстанировании A нужно использовать конструктор с параметром который кстати public.

Где ошибко непонятно.

PS:Кстати есть чо пажрать ищо?

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

> Но при инстанировании класса B используется конструктор с параметром в котором также указано что при инстанировании A нужно использовать конструктор с параметром который кстати public.

> Где ошибко непонятно.

тут указано:

B( int i ) : a(i) {}

а тут не указано, используется дефолтный A()

B(){}

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

Мля, ну не доступен конструктор A из класса B. Конструктор A доступен только членам A и друзьям A.

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

Ошибаетесь, конструктор с параметром A(int) доступен всем, стало понятно что в данном случае компилятор ругается на декларацию в которой мог бы быть использован конструктор по умолчанию A() который private, но почему он не ругается на приватный конструктор B() который тоже мог бы быть использован остается загадкой.

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

Получается что компилятор встретив дифиницию B::B() задумывает сгенерировать код типа call A::A(), но тут бац видит что A::A() недоступен в данном контексте и генерирует ошибку, но зачем он генерирует код для B::B()? Всетаки g++ суров.

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

>> public: >> A a;

> тебе противопоказан ООП

s/ООП/c++/

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

> но зачем он генерирует код для B::B()?

Потому чта это его священный долг - самому слепить конструктор без параметров, ежели никакой пользовательский конструктор в этом какчестве использовать низзя. А тута ты его еще об этом и специяльно попросил, определив такой конструктор.

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