Форум программистов, компьютерный форум CyberForum.ru

Конструктор копий - C++

Восстановить пароль Регистрация
 
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
21.10.2012, 20:50     Конструктор копий #1
Можно ли вызвать в конструкторе копий, конструктор, если объекту нечего передавать? Класс - абстрактный. В конструкторе идет подсчет созданных объектов, поэтому хотелось бы, чтобы конструктор копий вызывал конструктор.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.10.2012, 20:58     Конструктор копий #2
Это имеете в виду?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Foo
{
    Foo()
    {
 
    }
 
    Foo(const Foo&): Foo()
    {
 
    }
};
 
int main()
{
    /* code */
    return 0;
}
Если да, то только в C++11
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
21.10.2012, 21:00  [ТС]     Конструктор копий #3
Можно ли такое сделать в абстрактном классе?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6165 / 2894 / 282
Регистрация: 04.12.2011
Сообщений: 7,694
Записей в блоге: 3
21.10.2012, 21:21     Конструктор копий #4
Цитата Сообщение от OlVD Посмотреть сообщение
Можно ли такое сделать в абстрактном классе?
Не уверен, что понял вопрос.
У вас есть класс в котором кроме методов, есть счётчик влияющий на их работу?
Тогда может так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class AbstrFunClass{
public:
static int m_count=0;
void foo1();
void foo2(int b);
float foo3(bool c);
private:
AbstrFunClass();//запретили создание объекта по умолчанию на всякий)
}
//определили методы
*****************
//
обращаемся через имя типа:
AbstrFunClass::m_count++;//к счетчику
к методам:
AbstrFunClass::foo1();
счётчик можно и закрыть. Если определились вызов какого метода/дов класса аналогичен созданию нового экземпляра, в вашем случае, - в этом методе/дах можно инкрементировать счётчик, не обращаясь к нему непосредственно.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.10.2012, 21:22     Конструктор копий #5
OlVD, да, если есть поддержка C++11
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
21.10.2012, 21:35  [ТС]     Конструктор копий #6
У меня абстрактный класс родитель. Нельзя создать ни одного объекта этого класса. Вот именно в нем, как можно переопределить конструктор копирования, чтобы он вызывал конструктор этого же класса?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6165 / 2894 / 282
Регистрация: 04.12.2011
Сообщений: 7,694
Записей в блоге: 3
21.10.2012, 21:42     Конструктор копий #7
Цитата Сообщение от OlVD Посмотреть сообщение
У меня абстрактный класс родитель. Нельзя создать ни одного объекта этого класса. Вот именно в нем, как можно переопределить конструктор копирования, чтобы он вызывал конструктор этого же класса?
Если класс не имеет конструктора, то есть нельзя создать объект, что же копировать?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.10.2012, 21:46     Конструктор копий #8
Цитата Сообщение от OlVD Посмотреть сообщение
У меня абстрактный класс родитель
А. Ну да. IGPIGP, ответил уже.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.10.2012, 22:11     Конструктор копий #9
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если класс не имеет конструктора, то есть нельзя создать объект
если конструктор неописан явно то это не значит что его нет, а объект нельзя создать потому что класс абстрактный т.е. имеет хотя бы одну чисто виртуальную функцию
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
21.10.2012, 22:14  [ТС]     Конструктор копий #10
Конструктор описан явно.

Добавлено через 2 минуты
C++
1
2
3
4
5
class X {
public:
  X() : { }
  X(const X &) : X() { }
};
так не получается
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.10.2012, 22:16     Конструктор копий #11
Цитата Сообщение от OlVD Посмотреть сообщение
так не получается
что мешает увеличить счетчик в теле конструктора копий?
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
21.10.2012, 22:17  [ТС]     Конструктор копий #12
два раза прописывать одно и тоже???
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.10.2012, 22:19     Конструктор копий #13
Цитата Сообщение от OlVD Посмотреть сообщение
два раза прописывать одно и тоже???
ну если так уж много дейсвий, вынеси в отдельный метод и вызывай из конструкторов
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6165 / 2894 / 282
Регистрация: 04.12.2011
Сообщений: 7,694
Записей в блоге: 3
21.10.2012, 22:19     Конструктор копий #14
Цитата Сообщение от Jupiter Посмотреть сообщение
если конструктор неописан явно то это не значит что его нет, а объект нельзя создать потому что класс абстрактный т.е. имеет хотя бы одну чисто виртуальную функцию
Если конструктор не описан то его предоставит система. Я и имел ввиду случай когда он не нужен. Объект же создать у такого класса нельзя. Указатель на базовый класс (в том числе абстрактный) можно. Может ТС покажет код, тогда будет понятнее.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.10.2012, 22:35     Конструктор копий #15
Фу, е-мое. Сбили меня с панталыку своими абстрактными, правильно же говорил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstdlib>
 
class Foo
{
protected:
    static std::size_t _count;
 
public:
    Foo()
    {
        std::cout << "Foo()" << std::endl;
        ++_count;
    }
 
    Foo(const Foo&): Foo()
    {
        std::cout << "Foo(const Foo&)" << std::endl;
    }
 
    virtual ~Foo()
    {
        --_count;
    }
 
    virtual void foo() = 0;
};
 
std::size_t Foo::_count;
 
struct Bar: public Foo
{
    void foo()
    {
        std::cout << _count << std::endl;
    }
};
 
int main()
{
    Bar b;
    Bar b2(b);
    b.foo();
    return 0;
}
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
21.10.2012, 23:30  [ТС]     Конструктор копий #16
не разрешает. Пишет, что type 'foo' is not a direct base of 'foo'
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.10.2012, 23:41     Конструктор копий #17
Цитата Сообщение от OlVD Посмотреть сообщение
не разрешает. Пишет, что type 'foo' is not a direct base of 'foo'
пфф...ещё раз
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <cstdlib>
 
class Foo
{
private:
    static void increment()
    {
       ++_count;
    }
protected:
    static std::size_t _count;
 
public:
    Foo()
    {
        std::cout << "Foo()" << std::endl;
        increment();
    }
 
    Foo(const Foo&)
    {
        std::cout << "Foo(const Foo&)" << std::endl;
        increment();
    }
 
    virtual ~Foo()
    {
        --_count;
    }
 
    virtual void foo() = 0;
};
 
std::size_t Foo::_count;
 
struct Bar: public Foo
{
    void foo()
    {
        std::cout << _count << std::endl;
    }
};
 
int main()
{
    Bar b;
    Bar b2(b);
    b.foo();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2012, 05:23     Конструктор копий
Еще ссылки по теме:

C++ Что такое конструктор копий?
C++ С++ Конструктор копий. Функция, работающая с объектами
Конструктор копий C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.10.2012, 05:23     Конструктор копий #18
не разрешает. Пишет, что type 'foo' is not a direct base of 'foo'
Я раза два говорил про поддержку C++11.
Yandex
Объявления
22.10.2012, 05:23     Конструктор копий
Ответ Создать тему
Опции темы

Текущее время: 19:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru