Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите исправить ошибку  (Прочитано 6665 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Robinson
Интересующийся

ru
Offline Offline

« : 14-10-2008 10:23 » 

Здравствуйте, я новичек в Visual C++. Подключил .h файл с классом списка к проекту (List.h). Нужно использовать один и тот же список в разных обработчиках. Если описываю экземпляр этого класса в обработчике события (например кнопки) то всё работает:

Код:
. . .
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e)
{
    List lst(0);
    lst.add(1);
}

Если описываю вне обработчиков (как глобальный):
Код:
. . .
List lst(0);
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e)
{
    List lst(0);
    lst.add(1);
}

то возникает ошибка: error C2228: left of '.getTop' must have class/struct/union

Помогите разобраться, почему она возникает и как сделать экземпляр этого класс доступным в обработчиках событий?
Записан
Robinson
Интересующийся

ru
Offline Offline

« Ответ #1 : 14-10-2008 10:31 » 

т.е.
Код:
. . .
List lst(0);
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e)
{
    lst.add(1);
}
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 14-10-2008 10:35 » 

List lst(0); - это должно быть в функции. Тебе нужно сделать
List lst;
членом класса
« Последнее редактирование: 14-10-2008 15:55 от Алексей1153++ » Записан

Robinson
Интересующийся

ru
Offline Offline

« Ответ #3 : 14-10-2008 12:01 » 

Тоесть мне нужно использовать конструктор по умолчанию?

если я просто пишу
Код:
List lst;

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
lst.add(1);
}
то возникает ошибка: error C4368: cannot define 'lst' as a member of managed 'RungeKutt4::Form1': mixed types are not supported
                                     error C2662: 'List::getTop' : cannot convert 'this' pointer from 'List' to 'List &'
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 14-10-2008 15:30 » 

Я конечно понимаю, что Visual C++.Net Это не есть стандартный С++. Но раз ты используеш класс из генерик колекции, разве его так иницилизируют? По крайней мере >тут< утверждается обратное. Ты должен указать тип, с которым список будет работать.
Код:
List lst<int>;
И судя по примеру по ссылке, идет не подключения самого хедера, а подключение namespace.
Код:
using namespace System::Collections::Generic;
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Robinson
Интересующийся

ru
Offline Offline

« Ответ #5 : 14-10-2008 17:54 » 

дело в том что я НЕ использую класс из генерик колекции, класс List это мой класс. Вот его код:
List.h
Код:
#pragma once

class List
{

private:

class node
{

friend class List;

public:

node(double node_val):val(node_val)
{
}

node()
{
}

~node()
{
}

node *next;
node *prev;
double val;

};

node *head;
node *tail;
node *temp;
int size;

public:

List()
{
tail = new node(0);
tail->next = 0;
tail->prev = 0;
head = tail;
temp = tail;
size = 1;
}

List(double arg)
{
head = new node(arg);
head->next = 0;
head->prev = 0;
tail = head;
temp = tail;
size = 1;
}

bool isEmpty() const
{
return temp == 0;
}

int getSize()
{
return size;
}

double getTop()
{
return head->val;
}

void add(double arg)
{
node *node_to_add = new node(arg);
node_to_add->prev = head;
node_to_add->next = 0;
head->next = node_to_add;
head = node_to_add;
size++;
}

double getValue()
{
if(!isEmpty())
{
double buf = temp->val;
temp = temp->next;
return buf;
}
else
{
return -1;
}
}

int set(int num)
{
temp = tail;
if(num < size)
{
for(int i = 1;i < num;i++)
{
if(!isEmpty())
{
temp = temp->next;
}
else
{
return 2;
}
}
return 0;
}
else
{
return 1;
}
}

void stepBack()
{
if(!isEmpty())
{
temp = temp->prev;
}
}

~List()
{
node* pbuf = tail;
for(node* s = tail; s!=0;)
{
s = s->next;
delete pbuf;
pbuf = s;
}
delete pbuf;
}

};

я подключаю его к проекту и в Form1.h пытаюсь описать его экземпляр как глобальный, а потом из обработчика к этому списку обращаться...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 14-10-2008 19:34 » 

Robinson, Перевожу дословно, На что ругается у тебя компилятор
Цитата
error C4368: cannot define 'lst' as a member of managed 'RungeKutt4::Form1': mixed types are not supported
                                     error C2662: 'List::getTop' : cannot convert 'this' pointer from 'List' to 'List &'
Цитата
Ошибка C4368: Не могу определить "lst" как член управляемого класса  'RungeKutt4::Form1': смешивание типов не поддерживается.
Ошибка C2662: 'List::getTop' :не могу перевести указатель this с List в List &.
Как я сказал раньше Visual C++.NET Это не одно и тоже, что стандартный C++. В частности в нем используется механизм управляемой памяти. И как сказал компилятор, смешивать два механизма не допускается.
Тебе выбирать, Или ты пишеш на C++.NET или на С++. И естественно играть по тем правилам, которые ты выбрал.
« Последнее редактирование: 14-10-2008 19:41 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines