2016-10-17 7 views
0

Как ниже, указатель строки инициализации с использованием синтаксиса Line(string arg): foo{new string(arg)} {}, но не для динамического массива, он failes использовать Line(int* arg): p_matrix{new int[3](arg)} {} (давайте временно забыть правило пяти)Есть ли простой способ инициализировать элемент данных, который является динамическим массивом в C++?

Как инициализировать динамический массив, который сам по себе является член данных класса

#include <iostream> 
#include <string> 

using namespace std; 

class Line 
{ 
    public: 

     string* foo; 
     Line(string arg): foo{new string(arg)} {} 

     int* p_matrix; 
     Line(int* arg): p_matrix{new int[3](arg)} {} 
}; 

int main() 
{ 
    Line line {"bar"}; 
    cout << *(line.foo); 

    int matrix[3] = {1,2,3}; 
    Line line2 {matrix}; 
    cout << line2.p_matrix[0]; 
    return 0; 
} 
+0

Вы можете написать 'new int [3] {arg [0], arg [1], arg [2]}'. Если вы не хотите этого делать, вам нужно написать цикл в конструкторе. Чтобы избежать такого рода проблем, используйте меньше массивов и указателей на raw и больше используйте классы, такие как 'string' и' array'. –

+0

@ M.M Sad знать это – Nicholas

ответ

1

проблема заключается в том, что эта линия:

Line(int* arg): p_matrix{new int[3](arg)} {} 

пытается присвоить int* Ань int ,

Вы можете инициализировать массив следующим образом:

Line(int* arg) 
: p_matrix{new int[3]()} 
{ 
    for(int i = 0; i < 3; ++i) 
    { 
     p_matrix[i] = arg[i]; 
    } 
} 

Это не очень безопасно.

Если вы хотите инициализировать его в списке инициализаторов, я подозреваю, что вы можете использовать lambas. Я не слишком хорошо знаком с этим, так что, может быть, кто-то еще мог бы объяснить.

+0

не требуется лямбда, только статическая вспомогательная функция –

+0

Почему, на ваш взгляд, это не очень безопасно? – Nicholas

+0

@BenVoigt Не могли бы вы рассказать мне, как написать статическую вспомогательную функцию, которую вы упомянули? – Nicholas

 Смежные вопросы

  • Нет связанных вопросов^_^