2014-01-31 3 views
2

Это для домашней работы.Доступ к массиву внутри конструктора

У меня есть googled и поиск в stackoverflow, но я не могу найти ответ. Возможно, моя терминология неверна.

Я изучаю TDD для класса, и мои навыки C# ржавы и ограничены.

Я пытаюсь написать класс стека. Когда я пытаюсь инициировать массив внутри конструктора, методы не могут получить к нему доступ.

Я уверен, что это нечто простое, что мне не хватает. Вот код, что я пытался до сих пор:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace tdd_programmingTest 
{ 
    class Stack 
    { 
     int index = 0; 

     public Stack() 
     { 
      int[] items; 
     } 

     public void Push(int p) 
     { 
      items[index] = p; 
      index++; 
     } 

     public int Pop() 
     { 
      index--; 
      return items[index]; 
     } 

     internal int IndexState() 
     { 
      return index; 
     } 
    } 
} 

Я не ищу кого-то, чтобы написать код для меня, просто мне точку в правильном направлении. Спасибо.

ответ

1

Поместите int[] items; вне конструктора и добавить size параметр в конструктор, чтобы указать размер items:

class Stack 
{ 
    int index = 0; 
    int[] items = new int[0]; 

    public Stack(int size) 
    { 
     items = new int[size]; // initiate items with size 
    } 

    public void Push(int p) 
    { 
     items[index] = p; 
     index++; 
    } 

    public int Pop() 
    { 
     index--; 
     return items[index]; 
    } 

    internal int IndexState() 
    { 
     return index; 
    } 
} 
+0

Благодарим за ответ, но в итоге мне нужно будет добавить параметр к конструктору, чтобы указать размер. Насколько я понимаю, этот метод сам по себе не позволит мне это сделать. – user3255843

+0

См. Мой отредактированный ответ, вы можете добавить параметр 'size' в конструктор и инициировать' элементы' с определенным размером. – ekad

+0

Это была одна из моих первоначальных мыслей, но когда я это делаю, Visual Studio ставит зеленую строку под элементами _int [], объясняя, что она никогда не назначается. – user3255843

5

То, что вы здесь является local variable:

public Stack() 
    { 
     int[] items; 
    } 

Он выходит только внутри конструктора Stack() и только на время его выполнения.

Вы должны объявить items как (переменной-члена) в field:

class Stack 
{ 
    private int index = 0; 
    private int[] items;  // <-- move it here, and mark it private 

    public Stack() 
    { 

    } 
    // ... 
} 

Но у вас есть большие проблемы. Это всего лишь ссылка на массив, который вы еще не создали.

Таким образом, вы должны создать экземпляр массива:

int[] items = new int[SIZE]; 

... но какой размер вы используете? Когда вы создадите массив, он не сможет расти. Вам придется выделить более крупный массив и скопировать его, как только у вас закончится свободное пространство. Это авто-саморасширение - это то, как работает ADT под капотом.

Говоря об исчерпании пространства, вы должны обратить внимание на границы вашего массива в Push() и Pop()!


EDIT: Поэтому вам нужно указать размер. Просто добавьте параметр в конструктор.

class Stack 
{ 
    private int index = 0; 
    private int[] items; 

    public Stack(int initialSize) 
    { 
     items = new int[initialSize]; 
    } 

    public Stack() : Stack(100) 
    { 
    } 
} 
+0

Точно. Насколько я понимаю, мне пришлось бы инициировать массив внутри конструктора, чтобы я мог передать параметр для размера. Здесь я все еще испытываю проблемы. Я понимаю, что мои Push() и Pop() неполны. Это назначение TDD является моим первым и требует, чтобы я написал код и протестировал его очень маленькими приращениями. EDIT: Или вы предполагаете, что если я начну с массива размером один, мне нужно создать новый массив большего размера и скопировать предыдущий в каждый раз, когда я назову Push()? – user3255843

+0

Многие классы контейнеров принимают в своем конструкторе параметр * необязательного * начального размера, но по умолчанию что-то говорят 10. Тогда каждый раз, когда он становится полным (обнаружен в 'Push()'), вы выделяете новый массив * дважды, как большой *, и копировать все в новый массив. –

+0

Требование назначения - объявлять определенный размер каждый раз, когда он инициируется. – user3255843

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