Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/54: Рейтинг темы: голосов - 54, средняя оценка - 4.67
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18

Явный вызов конструктора

03.10.2009, 19:06. Показов 10084. Ответов 10

Студворк — интернет-сервис помощи студентам
Всем привет. Есть примерно такой код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. Мой класс
class my_class {
   // ...
};
 
2. Конструктор моего класса
my_class::my_class()
{
   // ...
}
 
3. Двумерный динамический массив объектов моего класса
my_class **massiv;
 
massiv = new my_class*[10]; // Массив ссылок
 
for (int i=0; i<10; i++)
{
   massiv[i] = new my_class[5];
}
Подскажите как организовать явный вызов конструктора, чтобы поиметь возможность передавать ему параметры.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.10.2009, 19:06
Ответы с готовыми решениями:

Явный вызов деструктора
Добрый вечер всем! Я раньше читал статью о деструкторах, и там говорилось что можно явно вызвать деструктор. Статью я прочитал и забыл) И...

Явный вызов деструктора
Есть класс Person, с полями string,string,long. Исходные данные хранятся в файле. Нужно сделать вектор объектов этого класса. ...

Явный вызов перегрузки
Всем привет, можно ли как-то указать ораклу явно какую перегрузку использовать?

10
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
03.10.2009, 19:17
Это можно сделать так:
C++
1
a = new class_name [5](arg1, arg2);
Но такая инициализация поддерживается не всеми.
0
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
03.10.2009, 22:11  [ТС]
Попробовал, Visual 2008 ругается

error: C2075: 'Target of operator new': array initialization needs curly braces

в обшем фигурные скобки просит, чтобы массив инициализировать
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
03.10.2009, 22:25
так попробуй
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main ()
{
    int *x = new int[5];
 
    for(int i = 0; i < 5; ++i){
        new (&x[i]) int(i + 1);
 
        std::cout << x[i] << std::endl;
    }
    delete[] x;
    
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
04.10.2009, 01:18
Ti]v[, вот, что получилось:
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
#include <iostream>
using std::cout;
using std::endl;
 
class MyClass {
public:
    MyClass(int val);
    int getVal();
private:
    int m_val;
};
 
MyClass::MyClass(int val){
    m_val = val;
}
 
int MyClass::getVal(){
    return m_val;
}
 
int main(){
    MyClass ***arr; // указатель на указатель на указатель на MyClass ;)
    int rows, cols, i, j, count;
    rows = 10;
    cols = 5;
    count = 0;
    arr = new MyClass**[rows];
    for ( i = 0; i < rows; i++ )
        arr[i] = new MyClass*[cols];
    
    for ( i = 0; i < rows; i++ )
        for ( j = 0; j < cols; j++ )
            arr[i][j] = new MyClass(++count);
            
    for ( i = 0; i < rows; i++ )
        for ( j = 0; j < cols; j++ )
            cout << (arr[i][j])->getVal() << endl;
 
    for ( i = 0; i < rows; i++ ){
        for ( j = 0; j < cols; j++ )
            delete arr[i][j];
        delete[] arr[i];
    }
    delete[] arr;
    
    return 0;
}
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
04.10.2009, 12:09
Есть несколько грязноватый и хакообразный, но всё же достаточно легальный и простой вариант с in-place new:
C++
1
2
3
4
5
6
massiv = reinterpret_cast<my_class> (new char[sizeof(my_class)*10]); // Массив объектов
 
for (int i=0; i<10; ++i)
{
   new(massiv+i) my_class(arg1, arg2);  // Этой разновидности оператора new передаётся адрес создаваемого объекта
}
in-place new получает адрес участка в памяти, отведённого под объект и не выделяет память, а конструирует объект по заданному адресу (конструирует полностью, как надо: заполняет указатель на VMT и прочие служебные поля, вызывает конструктор).
Только вот при уничтожении придётся вызывать деструкторы вручную:
C++
1
2
3
for(int i=0; i<10; ++i)
    massiv[i].~my_class();
delete [] massiv;
0
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
04.10.2009, 15:10  [ТС]
Nick Alte, error C2440: 'reinterpret_cast': cannot convert from 'char*' to 'my_class'. Возможно я что то недопонял. просто я с С++ всего полгода, читать между строк пока не получается

ISergey, тоже не прошло, даже не понял что не так.

easybudda, параметры передаются но есть проблема с освобождением памяти. Строка delete arr[i][j]; вызывает ошибку С2440: 'delete': cannot convert from 'my_class' to 'void*'. Если её закоментировать то начинает компилироваться, но во время выполнения вылезает ошибки с просьбой отправить сообщение Гейтсу.
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
04.10.2009, 15:42
Цитата Сообщение от Ti
v[;291396]ISergey, тоже не прошло, даже не понял что не так.
Так нагляднее будет
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
#include <iostream>
 
class Employee{
    int i;
public:
    Employee(int i_ = -1) : i(i_){
        std::cout << i << std::endl;
    }
 
    ~Employee(){
        std::cout << "~Employee() i = "<< i << std::endl;
    }
};
int main ()
{
    Employee **e = new Employee*[5];
    for(int i = 0; i < 5; ++i){
        e[i] = new Employee[5];
        for(int j = 0; j < 5; ++j)
            new (&e[i][j]) Employee(j + i);
    }
 
    for(int i = 0; i < 5; ++i){
        delete[] e[i];
    }
    delete[] e;
    return 0;
}
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
04.10.2009, 15:48
Ну подумаешь, опечатался. Забыл звёздочку.
C++
1
my_class *massiv = reinterpret_cast<my_class *> (new char[sizeof(my_class)*10]);
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
04.10.2009, 16:53
Ti]v[, не поверите! Тремя разными компиляторами проверил (cl от vs 2005 и двумя разными g++). Ниодин не ругнулся и всё работает... Попробуйте вот так
C++
1
2
3
4
...
    for ( j = 0; j < cols; j++ )
        delete (arr[i][j]);
...
сделать - вдруг поможет?..
0
 Аватар для Ti]v[
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
04.10.2009, 23:44  [ТС]
Ребята, всем спасибо, всё попробую. Сейчас я немного подругому делаю - без явноговызова. В силу специфики программы, при использовании явного вызова, дальше ещё больше проблем появляется. В основном с указателями и областями видимости. Я пока слишком молодой, чтобы в одиночку с ними бороться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.10.2009, 23:44
Помогаю со студенческими работами здесь

Вызов конструктора из конструктора и проверка правильности передаваемых параметров
Существует такой код: public Matrix(Double array) : this(array.GetLength(0), array.GetLength(1)) { ...

Явный вызов конструкторов перемещения
Для перемещения предлагается такая запись: TYPE a; TYPE b = std::move(a); Но при этом, если у объекта не задан конструктор...

Явный вызов и объявление статических полей
1) Как сделать невозможным явный вызов деструктора и операторов? class MyClass { private : int _n; public : MyClass(int...

Вызов конструктора из конструктора - ошибка
Айм водеринг. Но разве из одного конструктора нельзя вызвать другой (из StadoOvechek() вызвать StadoOvechek(int countOvechkas) ) ? Вот...

Явный вызов оператора или функции доступа невозможен (xNet & Fleck)
Добрый день, форумчане. Нарыл небольшой проект Steam trade botа'а, но в нём имеются несколько повторяющихся ошибок в коде, прошу...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru