Вопрос по C++

Модератор: Модераторы разделов

Аватара пользователя
Sets
Сообщения: 21
ОС: Linux Fedora8

Вопрос по C++

Сообщение Sets »

Уважаемые гуру скажите пожалуйста возможна ли компиляция такого вот кода?:

Код: Выделить всё

class First
{
    public:
        First() {}
        ~First() {}
        int test() {return 0;}
    private:
        Second * obj1;
};

class Second
{
    public:
        Second() {}
        ~Second() {}
        int test2() {return 0;}
    private:
        First * obj2;
};

int main()
{
    First a;
    return 0;
}
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Вопрос по C++

Сообщение IMB »

Я не гуру, но на мой взгляд нет по причине нарушения синтаксиса, во многих местах пропущены ;.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Вопрос по C++

Сообщение eddy »

А откуда ваш класс 1 возьмет указатель на класс 2? Объявите сначала второй класс, потом определите их оба.
P.S. да, и соблюдайте синтаксис
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
lava
Сообщения: 155
ОС: archer

Re: Вопрос по C++

Сообщение lava »

Sets, а компилятор поставить - никак?
С точки зрения логики ничего крамольного не написано. Просто будет создаваться экземпляр класса First, в котором есть место под указатель на экземпляр класса Second, но на этом месте ничего не будет.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Вопрос по C++

Сообщение eddy »

Не думаю, что с таким количеством ошибок компилятор сообщит что-нибудь более-менее внятное :)
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Sets
Сообщения: 21
ОС: Linux Fedora8

Re: Вопрос по C++

Сообщение Sets »

IMB писал(а):
16.03.2010 09:31
Я не гуру, но на мой взгляд нет по причине нарушения синтаксиса, во многих местах пропущены ;.

где именно?

eddy писал(а):
16.03.2010 09:33
А откуда ваш класс 1 возьмет указатель на класс 2? Объявите сначала второй класс, потом определите их оба.
P.S. да, и соблюдайте синтаксис

как это можно сделать?


eddy писал(а):
16.03.2010 09:44
Не думаю, что с таким количеством ошибок компилятор сообщит что-нибудь более-менее внятное :)

где ошибка то?
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Вопрос по C++

Сообщение Nazyvaemykh »

man Forward Declaration?

первой строчкой неплохо бы написать class Second;
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Вопрос по C++

Сообщение eddy »

Вот работающий вариант. Дальше сами доделывайте.

Код: Выделить всё

#include <iostream>

class Second;
class First{
    private:
        Second *obj1;
    public:
        First(){};
        ~First(){};
        int test(){return 0;}
};

class Second{
    public:
        Second(){};
        ~Second(){};
        int test2() {return 1;}
    private:
        First obj2;
};

int main()
{
    First a;
    std::cout << a.test() << '\n';
    return 0;
}


P.S. Почитайте-ка сначала литературу, а потом уж за С++ беритесь.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Sets
Сообщения: 21
ОС: Linux Fedora8

Re: Вопрос по C++

Сообщение Sets »

Nazyvaemykh писал(а):
16.03.2010 10:18
man Forward Declaration?

первой строчкой неплохо бы написать class Second;

Спасибо большое это именно то что мне нужно было

eddy писал(а):
16.03.2010 10:33
P.S. Почитайте-ка сначала литературу, а потом уж за С++ беритесь.

хм...оказывается после конструктора нужен ; у меня компилировался и без него
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Вопрос по C++

Сообщение eddy »

Sets писал(а):
16.03.2010 10:53
у меня компилировался и без него

Чем???
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Sets
Сообщения: 21
ОС: Linux Fedora8

Re: Вопрос по C++

Сообщение Sets »

eddy писал(а):
16.03.2010 10:59
Sets писал(а):
16.03.2010 10:53
у меня компилировался и без него

Чем???

g++

Код: Выделить всё

sets@admin:~/progs/cpp/1$ cat 2.cpp
#include <iostream>

class Second;
class First
{
    public:
        First() {}
        ~First() {}
        int test();
    private:
        Second * obj;
};

class Second
{
    public:
        Second() {}
        ~Second() {}
        int test2() {return 2;}
    private:
        First * obj;
};

int First::test()
{
    obj = new Second();

    int a;
    a = obj->test2();

    std::cout << a  << std::endl;
    delete obj;
    obj=0;
}

int main()
{
    First a;

    a.test();

    return 0;
}
0;sets@admin: ~/progs/cpp/1sets@admin:~/progs/cpp/1$ g++ 2.cpp
sets@admin:~/progs/cpp/1$ ./a.out
2
Спасибо сказали:
Аватара пользователя
Sets
Сообщения: 21
ОС: Linux Fedora8

Re: Вопрос по C++

Сообщение Sets »

а вот кстати пример из книги Бьярна Страуструпа "Язык программирования С++" 7.3.1 Конструкторы

Код: Выделить всё

class complex {
            double re, im;
         public:
            complex(double r, double i =0) {  re=r; im=i; }

            friend complex operator+(complex, complex);
            friend complex operator*(complex, complex);

            complex operator+=(complex);
            complex operator*=(complex);

            // ...
         };

тут он тоже не поставил ; в кострукторе, так как правильно писать на самом деле?
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Вопрос по C++

Сообщение RasenHerz »

Sets писал(а):
16.03.2010 11:15
тут он тоже не поставил ; в кострукторе, так как правильно писать на самом деле?

Все правильно, First() {} - конструктор с пустым телом, а ставить ; надо только при объявлении функции/конструктора/деструктора, при их реализации можно этого не делать.
Спасибо сказали:
Аватара пользователя
Sets
Сообщения: 21
ОС: Linux Fedora8

Re: Вопрос по C++

Сообщение Sets »

RasenHerz писал(а):
16.03.2010 11:58
Все правильно, First() {} - конструктор с пустым телом, а ставить ; надо только при объявлении функции/конструктора/деструктора, при их реализации можно этого не делать.

Спасибо большое, так и думал... а то накинулись на меня ни за что мол книжки читать надо, при том что я их читаю :)
Спасибо сказали: