0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
1

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

03.10.2009, 19:06. Показов 9708. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2009, 19:06
Ответы с готовыми решениями:

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

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

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

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

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

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

в обшем фигурные скобки просит, чтобы массив инициализировать
0
Maniac
Эксперт С++
1463 / 964 / 160
Регистрация: 02.01.2009
Сообщений: 2,818
Записей в блоге: 1
03.10.2009, 22:25 4
так попробуй
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Эксперт С++
11710 / 7217 / 1710
Регистрация: 25.07.2009
Сообщений: 13,218
04.10.2009, 01:18 5
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
Эксперт С++
1672 / 1044 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
04.10.2009, 12:09 6
Есть несколько грязноватый и хакообразный, но всё же достаточно легальный и простой вариант с 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
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
04.10.2009, 15:10  [ТС] 7
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
Эксперт С++
1463 / 964 / 160
Регистрация: 02.01.2009
Сообщений: 2,818
Записей в блоге: 1
04.10.2009, 15:42 8
Цитата Сообщение от 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
Эксперт С++
1672 / 1044 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
04.10.2009, 15:48 9
Ну подумаешь, опечатался. Забыл звёздочку.
C++
1
my_class *massiv = reinterpret_cast<my_class *> (new char[sizeof(my_class)*10]);
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11710 / 7217 / 1710
Регистрация: 25.07.2009
Сообщений: 13,218
04.10.2009, 16:53 10
Ti]v[, не поверите! Тремя разными компиляторами проверил (cl от vs 2005 и двумя разными g++). Ниодин не ругнулся и всё работает... Попробуйте вот так
C++
1
2
3
4
...
    for ( j = 0; j < cols; j++ )
        delete (arr[i][j]);
...
сделать - вдруг поможет?..
0
0 / 0 / 0
Регистрация: 03.10.2009
Сообщений: 18
04.10.2009, 23:44  [ТС] 11
Ребята, всем спасибо, всё попробую. Сейчас я немного подругому делаю - без явноговызова. В силу специфики программы, при использовании явного вызова, дальше ещё больше проблем появляется. В основном с указателями и областями видимости. Я пока слишком молодой, чтобы в одиночку с ними бороться.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2009, 23:44
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru