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"?

Re: Злобный G++

>   private:
>        B(){}

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

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


anonymous
()
Ответ на: Re: Злобный G++ от anonymous

Re: Злобный G++

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

yz
()

Re: Злобный G++

> A a;

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

anonymous
()

Re: Злобный G++

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

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

Absurd ★★★
()
Ответ на: Re: Злобный G++ от anonymous

Re: Злобный G++

> Но в данном примере нет вызова A::A() от чего ошибко то непанятно

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

class B
{
    public:
        A a;

andreyu ★★★★★
()
Ответ на: Re: Злобный G++ от andreyu

Re: Злобный G++

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

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

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

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

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

anonymous
()
Ответ на: Re: Злобный G++ от anonymous

Re: Злобный G++

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

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

тут указано:

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

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

B(){}

dilmah ★★★★★
()
Ответ на: Re: Злобный G++ от anonymous

Re: Злобный G++

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

anonymous
()
Ответ на: Re: Злобный G++ от anonymous

Re: Злобный G++

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

anonymous
()
Ответ на: Re: Злобный G++ от ACR

Re: Злобный G++

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

ACR
()
Ответ на: Re: Злобный G++ от xydo

Re: Злобный G++

>> public: >> A a;

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

s/ООП/c++/

anonymous
()
Ответ на: Re: Злобный G++ от ACR

Re: Злобный G++

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

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

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