Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2011, 15:49   #1
roadzero
Новичок
Джуниор
 
Регистрация: 03.04.2011
Сообщений: 2
По умолчанию Проблемы с созданием объекта своего типа,С#

Я описываю собственный класс и метод в нём:
Код:
public class Blocks
        {
            public string[] all_args;
            public String name;
            public string labeled;

           public Blocks(string name, string[]all_args, string labeled)
            {
                name = this.name;
                all_args = this.all_args;
                labeled = this.labeled;
            }

            public string PicName(int getname)
            {
                
                switch (getname)
                {
                    case 1:
                        name = "1.gif"; break;
                    case 2:
                        name = "2.gif"; break;
                    case 3:
                        name = "3.gif"; break;
                }
                return name;}
Затем я в main выполняю такие операции:
Код:
Blocks[] blocks = new Blocks[n];
blocks[j].name=blocks[j].PicName(checker);
При этом в последней строке у меня вылетает с ошибкой "В экземпляре объекта не задана ссылка на объект". Не представляю, с чем это связано.
roadzero вне форума Ответить с цитированием
Старый 04.04.2011, 16:05   #2
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Мне кажется это от того что ты объявил name не как тип а как объект. Тоесть надо писать либо
Код:
public String name=new String();
либо
Код:
public string name;
Т.е. с маленькой буквы.

Ну плюс у тебя еще не прально сделан твой конструктор, надо слово this вот так писать
Код:
           public Blocks(string name, string[]all_args, string labeled)
            {
                this.name = name;
                this.all_args = all_args;
                this.labeled = labeled;
            }
И вообще тебе проще внутри класса выполнять операцию присваивания.
Код:
            public PicName(int getname)
            {
                
                switch (getname)
                {
                    case 1:
                        this.name = "1.gif"; break;
                    case 2:
                        this.name = "2.gif"; break;
                    case 3:
                        this.name = "3.gif"; break;
                }
          }
Тогда вместо
Код:
blocks[j].name=blocks[j].PicName(checker);
можно писать просто
Код:
blocks[j].PicName(checker);
P.S. про инкапсуляцию почитай поподробнее.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.

Последний раз редактировалось KobolD; 04.04.2011 в 16:16.
KobolD вне форума Ответить с цитированием
Старый 04.04.2011, 16:56   #3
roadzero
Новичок
Джуниор
 
Регистрация: 03.04.2011
Сообщений: 2
По умолчанию

Я пробовал всё перечисленное, кроме правильного написания конструктора Исправил конструктор - тоже не помогло.

Подозреваю, что public string name=new string(); как раз и спасло бы положение, но вот беда - пустой конструктор остаётся непонятым (ни для string, ни для String).

Последний раз редактировалось roadzero; 04.04.2011 в 16:59.
roadzero вне форума Ответить с цитированием
Старый 04.04.2011, 17:16   #4
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Код:
Blocks[] blocks = new Blocks[n];
for (int i=0;j<n;i++) { blocks[i] = new Blocks(); }
blocks[j].PicName(checker);
это если есть конструктор без пораметров. (но в коде он не показан)

Если нужно использовать тот что показан. То параметры уже сами распишите.

типа
Код:
for (int i=0;j<n;i++) { blocks[i] = new Blocks("Name2", new string[] {"Arg1","Arg2"}, "Labeled1"); }
Ну или типа того. В зависимости от того что вы хотите сделать.

Ну или привидите весь код. А то сложно понять что же вы сделали а что забыли сделать.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 04.04.2011 в 17:23.
val_nnm вне форума Ответить с цитированием
Старый 04.04.2011, 17:23   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Код:
 
public Blocks(string name, string[]all_args, string labeled)
{
        name = this.name;
        all_args = this.all_args;
        labeled = this.labeled;
}
Мсье, а вы знаете, зачем нужен this?
Он позволяет скрывать и раскрывать имена, т.е. избавляться от коллизии имён.
Вот так....(а то получается, что вы аргументу функции присваиваете имя текущего объекта, да ещё и пытаетесь делать это в конструкторе).
Код:
this.name = name;
this.all_args = all_args;
this.labeled = labeled;
И ещё...
Код:
public Blocks(string name, string[]all_args, string labeled)
Нехорошо. Очень нехорошо. Нужно вот так:
Код:
public Blocks(string name,string labeled,params string[] all_args)
И ещё....
Код:
public Blocks(string name, string labeled,params string[] all_args)
{
        this.name = name;
        this.labeled = labeled;
        for (int i = 0;i<all_args.Length;i++)
        {
            this.all_args[i] = all_args[i];
        }
}
}
Да, здесь всё равно будут ошибки, но всё-таки уже меньше.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблемы с создание своего расширения! blackstersl Общие вопросы Delphi 32 04.08.2009 22:12
Преобразование типа объекта Oburec Общие вопросы Delphi 4 12.04.2009 14:20
Помогите с созданием своего архива Volod'ka БД в Delphi 11 26.01.2009 10:02
Создание своего типа данных xGroupers Общие вопросы Delphi 4 12.05.2008 13:53