Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/55: Рейтинг темы: голосов - 55, средняя оценка - 4.55
-12 / 4 / 2
Регистрация: 05.05.2014
Сообщений: 90
1

Как вызвать другой конструктор для уже созданного объекта конструктором по умолчанию?

05.06.2015, 16:30. Показов 9937. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть класс в котором несколько конструкторов, Мне в некоторых местах нужно создавать объекты класса с конструктором по умолчанию для предопределения. Как вызвать конструктор для существующего объекта?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2015, 16:30
Ответы с готовыми решениями:

Как вызвать конструктор для неизвестного объекта?
Добрый вечер. Помогите мне с задачей. Хочу написать шаблонный класс вектор. И в конструкторе по...

Получение объекта connection созданного конструктором
Никак не могу найти как получить объект connection если база данных подключена с помощью "Мастер...

Будет ли считаться конструктором по умолчанию данный конструктор?
Это конструктор с параметрами или конструктор по умолчанию? class MyClass { public MyClass(int...

Что такое конструктор по умолчанию? Как инициализируются данные-члены объекта?
Что такое конструктор по умолчанию? Как инициализируются элементы данных объекта, если класс...

35
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.06.2015, 16:41 2
Как родить родившегося ребёнка? Вам капсом ответить?) Выделите всё то, что вам надо в метод - вызывайте этот метод в конструкторе и тогда когда захотите
1
-12 / 4 / 2
Регистрация: 05.05.2014
Сообщений: 90
05.06.2015, 16:54  [ТС] 3
Я и без тебя уже разобрался, потому что ты даже не понял суть вопроса.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.06.2015, 17:01 4
И где я ошибся? Конструктор можно вызвать только на этапе создания объекта. До С++ 11 когда нельзя было делегировать вызов конструктора, применялся "лайф-хак" - выделение общих инструкций в метод.

0
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
05.06.2015, 17:28 5
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Конструктор можно вызвать только на этапе создания объекта.
Ну как сказать. Можно, например, использовать placement-new по адресу объекта, но это очень нехороший подход. Как минимум придётся позаботиться о явном вызове деструктора для существующего объекта. И в итоге получится цикл:
конструктор-по-умолчанию -> деструктор -> новый конструктор
Что есть потенциально небезопасная возня с памятью. Вывод - аккуратно рефакторим код так, чтобы объекты создавались только тогда, когда нужны.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.06.2015, 17:43 6
Цитата Сообщение от FraidZZ Посмотреть сообщение
использовать placement-new по адресу объекта
с таким подходом надо в конструкторе писать проверки чтоле?))))

C++
1
2
3
4
5
6
7
8
if(mIntArr)
{
    delete mInArr;
}
else
{
    mIntArr = new int[16];
}
Такой подход больше похож на "потому, что могу!".


Могу даже перефразировать:
- Конструктор можно вызвать только на этапе создания объекта, если вам необходимо вызвать конструктор для уже созданного объекта - у вас проблема с архитектурой.
0
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
05.06.2015, 17:47 7
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Такой подход больше похож на "потому, что могу!".
Я так и сказал:
Цитата Сообщение от FraidZZ Посмотреть сообщение
но это очень нехороший подход.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
с таким подходом надо в конструкторе писать проверки чтоле?))))
Нет, я имел в виду ручной вызов деструктора перед использованием placement-new.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Конструктор можно вызвать только на этапе создания объекта, если вам необходимо вызвать конструктор для уже созданного объекта - у вас проблема с архитектурой.
Так я это и написал
Цитата Сообщение от FraidZZ Посмотреть сообщение
Вывод - аккуратно рефакторим код так, чтобы объекты создавались только тогда, когда нужны.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
05.06.2015, 17:50 8
Blizzru, скорее всего ты затеял что-то ненормальное.
Покажи что ты хочешь сделать в виде нерабочего кода.
0
11 / 11 / 5
Регистрация: 01.04.2015
Сообщений: 120
05.06.2015, 17:50 9
прошу прощения, случайно наткнулся на тему еще вопросик , а если у нас пара конструкторов, один пустой один с параметрами , то соответсвенно при создании обьекта будет вызываться или первый или второй ?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
05.06.2015, 17:52 10
maestro4250, да, вызовется только один.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
05.06.2015, 18:27 11
Маленькое дополнение.
1 конструктор будет, если сработавший конструктор не содержит кода, вызывающего другой конструктор этого же класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
class MyClass{
    int x;
public:
    MyClass(int x){cout<<"Constr1\n";};    
    MyClass(){MyClass(5); cout<<"Constr2\n";};
};
 
int main(){
   MyClass A;
   MyClass B(5);
}
0
castaway
05.06.2015, 18:34
  #12

Не по теме:

daslex, хотел написать об этом, но посчитал это очевидным)

0
lss
05.06.2015, 18:37
  #13

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
Маленькое дополнение.
Извращенцы...:)

0
Заблокирован
05.06.2015, 18:51 14
Я затеял всё нормальное, просто ступил не подумав об указателях.
И с архитектурой у меня всё впорядке, просто кто-то некто любит выпендриваться думая что он самый умный, и не такой как все...

Я решил свою маленькую проблемку, всё работает.

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
#pragma once
#include"Rect.h"
#include"Text.h"
#include<iostream>
struct PickHeroMenuObjects;
 
class  PickHeroMenu : public Rect, public Text
{
public:
 
    PickHeroMenu(sf::String, float, float, float, float);
    void IsCheck(bool);
    bool GetIsCheck(void) const;
    void IsPick(void);
    void UpdateEvent(sf::Event &Event, sf::RenderWindow &window, sf::Vector2f &CursorGlobalPosition, PickHeroMenuObjects &obj);
    virtual void UpdateTime(float &time, sf::RenderWindow &window, sf::Vector2f &CursorGlobalPosition, PickHeroMenuObjects &obj);
    PickHeroMenu();
    ~PickHeroMenu(void);
 
private:
    float cr, cg, cb;
    bool isCheck;
    bool isEnable;
    bool isPick;
    bool isMaxScale;
    bool pick;
};
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
52
53
54
55
56
57
58
59
60
61
62
class PickHeroMenuObjects
{
public:
 
    std:: vector <PickHeroMenu*> HeroIcons;
    std:: list <PickHeroMenu*> Balls; 
    std:: vector <PickHeroMenu*>:: iterator vIter;
    std:: list <PickHeroMenu*>:: iterator lIter;
 
    PickHeroMenu *ButtonPickHero;
    PickHeroMenu *ButtonRandom;
    PickHeroMenu *ButtonMainMenu;
    PickHeroMenu *CheckGlow;
    PickHeroMenu *Description;
    PickHeroMenu *BackGround;
 
    PickHeroMenuObjects()
    {
        float sx = (float)GetSystemMetrics( SM_CXSCREEN ); float sy = (float)GetSystemMetrics( SM_CYSCREEN );
        setlocale(LC_ALL,"rus");
 
        ButtonPickHero = (new PickHeroMenu( "ButtonPickHero.png", sx*.3, sy*.1, sx*.84, sy*.68));
        ButtonRandom = (new PickHeroMenu( "ButtonRandom.png", sx*.3, sy*.1, sx*.84, sy*.79 ));
        ButtonMainMenu = (new PickHeroMenu( "ButtonMainMenu.png",sx*.3, sy*.1, sx*.84, sy*.9 ));
        CheckGlow = (new PickHeroMenu( "PickHeroCheckGlow.png", sx*.2, sx*.2, 0, 0 ));
        Description = (new PickHeroMenu( "PickHeroDescription.png", sx*.3, sy*.6, sx*.84, sy*.31 ));
        BackGround = (new PickHeroMenu( "PickHeroBackGround.png", sx, sy, sx/2, sy/2 ));
 
        HeroIcons.push_back( new PickHeroMenu ( "HeroGruntIco.png", 100, 100, sx*.125, sy*.13*0 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroOgreIco.png", 100, 100, sx*.125, sy*.13*1 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroPaladinIco.png", 100, 100, sx*.125, sy*.13*2 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroRickIco.png", 100, 100, sx*.125, sy*.13*3 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroTaurenIco.png", 100, 100, sx*.125, sy*.13*4 + (sy*.25)));
        std::cout << "Загрузка героев силы завершена.\n";
 
        HeroIcons.push_back( new PickHeroMenu ( "HeroWolfIco.png", 100, 100, sx*.285, sy*.13*0 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroMartellaIco.png", 100, 100, sx*.285, sy*.13*1 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroPunisherIco.png", 100, 100, sx*.285, sy*.13*2 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroSatyrIco.png", 100, 100, sx*.285, sy*.13*3 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroXimusIco.png", 100, 100, sx*.285, sy*.13*4 + (sy*.25)));
        std::cout << "Загрузка героев ловкости завершена.\n";
 
        HeroIcons.push_back( new PickHeroMenu ( "HeroJainaIco.png", 100, 100, sx*.450, sy*.13*0 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroMaryIco.png", 100, 100, sx*.450, sy*.13*1 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroSuccubIco.png", 100, 100, sx*.450, sy*.13*2 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroTreantIco.png", 100, 100, sx*.450, sy*.13*3 + (sy*.25))); 
        HeroIcons.push_back( new PickHeroMenu ( "HeroWarlockIco.png", 100, 100, sx*.450, sy*.13*4 + (sy*.25)));
        std::cout << "Загрузка героев разума завершена.\n";
 
        std::srand(time(0));
        int elem = 0;
        for(int i = 0; i < 300; i++)
        {
            int px = rand()%(int)sx;
            int py = rand()%(int)sy;
            int sz = rand()%20+10;
            Balls.push_back( new PickHeroMenu ( "FlyBall.png", sz, sz, px, py ));
            elem++;
        }
        std::cout << "Загрузка STL завершена. Загружено " << elem << " объектов.\n";
    }
};
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
05.06.2015, 18:57 15
Цитата Сообщение от lss Посмотреть сообщение
Извращенцы...
Ну почему же. В некоторых случаях это становится удобным.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
    int m_i;
    int m_j;
 
public:
    // ошибка
    //A( int i, int j = i ) : m_i( i ), m_j( j ) {}
 
    // всё нормально
    A( int i, int j ) : m_i( i ), m_j( j ) {}
    A( int i ) : A( i, i ) {}
};
 
int main()
{
    A a( 456 );
    return 0;
}
В этом примере мне необходимо дублировать значение в случае использования конструктора с одним параметром.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.06.2015, 19:03 16
Цитата Сообщение от daslex Посмотреть сообщение
MyClass(){MyClass(5); cout<<"Constr2\n";};
Тут вообще создание временного объекта, а не делегирование конструктора.
1
castaway
05.06.2015, 19:04
  #17

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Тут вообще создание временного объекта, а не делегирование конструктора.
Точно, а я и не заметил..

0
daslex
05.06.2015, 19:10
  #18

Не по теме:

И разве из-за этого приведенное мною высказывание становится ложью? У временного объекта при создании разве не конструктор срабатывает?

0
castaway
05.06.2015, 19:17
  #19

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
И разве из-за этого приведенное мною высказывание становится ложью?
Ложью не становится, просто пример плохой.

0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
05.06.2015, 19:24 20
Цитата Сообщение от castaway Посмотреть сообщение
В некоторых случаях это становится удобным.
Всё равно извращение. Какой смысл в конструкторе с одним параметром? Что мешает так сделать?
C++
1
A a( 456, 456 );
0
05.06.2015, 19:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2015, 19:24
Помогаю со студенческими работами здесь

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса?
class A { char * v; A(); ~A(); A(const A &amp;obj); } ///////////////////// A::A() {

В чем разница между конструктором по умолчанию и конструктором с параметрами?
Объясните пожалуйста в чем разница между конструктором по умолчанию и конструктором с параметрами,...

Как вызвать метод OnValueChanged() для слайдера, созданного в OnGUI()
Уважаемые программисты! Как вызвать метод OnValueChanged() для слайдера, созданного в OnGUI()...

Ошибка создания объекта через конструктор по умолчанию
Доброго времени. Хочу перегрузить оператор ввода для менюшки из if, но не получается. Можете...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru