2014-11-25 5 views
1

У меня есть этот классинициализация статического массива в конструкторе (C++)

class Dot 
{ 
    public:   // Methods 

    Dot();          // Default Constructor 
    Dot (int dot [], int k);      // Constructor 
    ~Dot();          // Destructor 
    int getDot();        // Get Function 
    void setDot (int dot []);     // Set Function 
    void PrintDot();       // Print Dot 


    private:   // Attributes 

    int m_k; 
    int m_dot []; 
}; 

И я хочу, чтобы написать конструктор

Dot::Dot(): m_k(2), m_dot[] ({0,0})    // Compilation Error 


Dot::Dot (int dot [], int k) 
{  
     m_k=k; 

     m_dot [k]= dot [k]; 
} 

по умолчанию, но я не знаю, как инициализировать статический массив m_dot в конструктор по умолчанию. Она не работает ... Я не могу инициализировать его как константу из второго конструктора (можно изменить значение к и точка массива там)

Благодарности

+0

Если я понимаю, это невозможно ... поэтому я могу написать второй конструктор Dot :: Dot (int dot [], int k), как это? Если я использую динамический массив, он работает? – Laura

+0

@Laura Почему бы просто не использовать 'std :: vector'? Синтаксис пустого массива в любом случае не является законным C++, по крайней мере, в том контексте, в котором вы его используете. – PaulMcKenzie

+0

@PaulMcKenzie вы имеете в виду, используйте динамический массив? И как я могу инициализировать его, поскольку я могу использовать его в двух конструкторах? – Laura

ответ

1

Массив вы пытаетесь использовать не является статическим, так как количество записей определяется параметром k, указанным в конструкторе. Массив на самом деле динамический, так что вы можете использовать то, что C++ предложения, и это std::vector:

#include <vector> 
class Dot 
{ 
    public:   // Methods 

     Dot();          // Default Constructor 
     Dot (int dot [], int k);      // Constructor 
     ~Dot();          // Destructor 
     int getDot();        // Get Function 
     void setDot (int dot []);     // Set Function 
     void PrintDot();       // Print Dot 

    private:   // Attributes 
     std::vector<int> m_dot; 
}; 

Тогда конструкторы будут выглядеть следующим образом:

Dot::Dot(): m_dot(2,0) {} 
Dot::Dot(int dot[], int k) : m_dot(dot, dot+k) {} 

Заметим, что вектор в основном оболочка для динамического массива. Также обратите внимание, что m_k больше не требуется, так как m_dot.size() сообщает вам количество записей.

+0

Спасибо! Но я ничего не понимаю (я начинающий новичок) о втором конструкторе, я должен инициализировать m_dot, т. Е. Мой вектор с разным значением и разной длиной (ex: (1,0,0) в этом случае k = 3 и точка (1,0,0). Здесь я изменяю длину моего вектора, но не его значения, не так ли? Я ошибаюсь? – Laura

+0

@Laura - Нет проблем, я объясню. с двумя аргументами делает именно то, что пыталась сделать ваша версия. То есть вы устанавливали каждый элемент 'm_dot' со значением' dot' в позиции 'k'. То, что делает второй конструктор, инициализирует вектор и делает копировать все записи «точка» в вектор за один раз (изменение размера выполняется автоматически). Два аргумента для вектора - это начальная запись в 'dot', а одна за конечной записью в' dot'. 'vector' здесь: http://en.cppreference.com/w/cpp/container/vector – PaulMcKenzie

+0

Я понял !! Спасибо большое !!! – Laura

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