2014-01-08 3 views
0

Я работаю над заголовком массива из базового определения массива для создания массива любого типа с этим заголовком, поэтому я создал класс массива с функциями и конструкторами. это мой код до сих пор:Создать массив с помощью указателей

#include <iostream> 
#define newline "\n" 
class Arr 
{ 
public: 
    typedef float T; 
public: 
    Arr(int size); 
    Arr(int size, T fill); 
    T get(unsigned index) const; 
    void set(unsigned index, T newvalue); 
    unsigned Size() const; 
    unsigned SIZE; 
    void Print(); 
private: 
}; 
Arr::Arr(int size,T fill) 
{ 
    SIZE = size; 
    T *pointer; 
    for (int i = 0; i < size; i++) 
    { 
     *pointer = fill; 
     pointer++; 
    } 
} 
void Arr::set(unsigned index, T newvalue) 
{ 
    T *pointer; 
    pointer = 0; 
    for (unsigned i = 0; i < index; i++) 
    { 
     pointer++; 
    } 
    *pointer = newvalue; 
} 
void Arr::Print() 
{ 
    T *pointer; 
    pointer = 0; 
    for (unsigned i = 0; i < SIZE; i++) 
    { 
     std::cout << *pointer << newline; 
     pointer++; 
    } 
} 

я знаю, что моя точка указателя на нет, так как мой вопрос мой указатель должен указывать на то, что, чтобы сделать этот код работать правильно ?! в любое время, когда я укажу его на 0 после отладки, он сработает! спасибо ...!

+2

Ваш код слишком ошибочен. [Читать книгу] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). Если у вас есть вопросы о чем-то, что книга пытается учить, вы можете спросить их здесь. Когда вы достаточно уверены в материале книги, ваш код должен быть менее ошибочным. –

+0

Вы не выделили память T в указателе T * в конструкторах Arr. Более того, даже если вы это сделали, вы не отслеживаете его нигде и доступны только в области методов не на уровне класса. – Abhinav

+0

Возможно, частный массив, или вы можете отказаться от всего класса и просто использовать std :: vector IdeaHat

ответ

0

Указатели являются сложной частью C++.

Вот хорошая ссылка, чтобы вы начали http://www.codeproject.com/Articles/7042/How-to-interpret-complex-C-C-declarations

Причина ваш код не работает это блок памяти для массива, на который указывает указатель не выделяется. Для этого вы должны использовать новый предшественник.

Вот пример

int size; 
T arr; 
T* ptr_2_arr; 
ptr_2_arr = new T[size]; 

Для извлечения элементов массива вы можете цикл массив, используя для взгляда

*ptr_2_arr[i]; 

надеюсь, что это помогает.

сообщение постановка задачи, если вам нужно более подробно

0

Вы должны сделать элемент данных класса, который укажет на выделенную память для массива. Также вам нужно определить конструктор копирования, оператор назначения копирования и деструктор. Также было бы лучше, чтобы тип размера параметра конструкторов совпадал с типом элемента данных SIZE, я не понимаю, почему эта переменная написана заглавными буквами.

Кроме того, нет смысла вводить элемент данных SIZE и функцию Size() public. если SIZE является общедоступным, он может быть изменен пользователем в любой момент.

0

Убедитесь, что вы указали размер массива в конструкторе.

SIZE = size; 

pointer = new T[size]; //this is where I see an issue. Specify the size of your array. 

for (int i = 0; i < size; i++) 
    { 
     *(pointer + i) = fill; //This is fine but you are filling up the array with only one number, fill. Nothing wrong with that if that is you intention. Try (*(pointer + i) = i; for i though size elements. 
    } 
Смежные вопросы