Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 32

Видимость объекта класса

12.11.2014, 17:40. Показов 1259. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется "игрушечный" класс только для того, чтобы понять суть. Определение (в файле MyClass.h):
C++
1
2
3
4
5
6
7
#pragma once
ref class MyClass
{
public:
    MyClass(int i);
    int ss;
};
Файл cpp:
C++
1
2
3
4
5
6
7
#include "StdAfx.h"
#include "MyClass.h"
 
MyClass::MyClass(int i)
{
    ss = i;
}
В классе формы две кнопки. В обработчиках нажатия кнопки мне нужно обращаться к одному и тому же объекту класса. Как это сделать? Пробовал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#pragma once
#include "MyClass.h"
namespace ExperiencewithMyClass {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
 
    /// <summary>
    /// Summary for Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
    //          MyClass ^mc = gcnew MyClass(2); // mc не виден в обоих обработчиках
 
            //
            //TODO: Add the constructor code here
            //
        }
//      MyClass ^mc = gcnew MyClass(2); // здесь ошибка
 
    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
    protected: 
    private: System::Windows::Forms::Button^  button2;
 
    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->button2 = (gcnew System::Windows::Forms::Button());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(51, 66);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(75, 23);
            this->button1->TabIndex = 0;
            this->button1->Text = L"button1";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            // 
            // button2
            // 
            this->button2->Location = System::Drawing::Point(152, 66);
            this->button2->Name = L"button2";
            this->button2->Size = System::Drawing::Size(75, 23);
            this->button2->TabIndex = 1;
            this->button2->Text = L"button2";
            this->button2->UseVisualStyleBackColor = true;
            this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(292, 273);
            this->Controls->Add(this->button2);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);
 
        }
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
        {
            MyClass ^mc = gcnew MyClass(2);
            MessageBox::Show("ss = " + System::Convert::ToString(mc->ss));
        }
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e)
        {
            MessageBox::Show("ss = " + System::Convert::ToString(mc->ss)); // здесь ошибка
        }
    };
}
В обработчике button2_Click объект mc не виден.
Если переставить
C++
1
MyClass ^mc = gcnew MyClass(2);
в другое место (помечен комментариями или выдает ошибку), то mc не виден в обоих обработчиках. Что посоветуете, уважаемые знатоки?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2014, 17:40
Ответы с готовыми решениями:

Windows Form Aplik-n: видимость класса
Всем здрасте... Нужно нажатием кнопки перейти с одной формы на другую и с другой на первую. Переход с 1-й формы на другую осуществляеться...

Использование объекта класса
В основном файле объявлен объект класса. При нажатии на кнопку должен вызываться метод класса для объекта созданного в основном файле. ...

Объявление глобального объекта класса
Есть RecTrans.h #include &quot;StdAfx.h&quot; #pragma once using namespace System; public value class RecTrans { private: String^ ...

4
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
12.11.2014, 19:44
MyClass ^mc нужно сделать переменной уровня типа (полем), чтобы её было видно вне класса. Я сейчас не буду затрагивать модификаторы доступа, оставлю public. Локальные переменные, например переменные, создаваемые в методе не видны вне метода.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
using namespace System;
 
ref class Dummy
{
public:
    Dummy(int v);
    // это переменная уровня класса - её видно извне
    int viewed;
};
 
Dummy::Dummy(int v) {
    viewed = v;
    int notViewed = 20;
};
 
int main(array<System::String ^> ^args) {
    Dummy^ d = gcnew Dummy(40);
    Console::WriteLine(d->viewed);
    d->viewed = 100;
    Console::WriteLine(d->viewed);
    return 0;
}
Поэтому в вашем примере нужно обяъвить
C++
1
2
3
4
5
6
7
8
9
10
public ref class Form1 : public System::Windows::Forms::Form
{
public:
    MyClass ^mc;
    Form1(void)
    {
        InitializeComponent();
        mc = gcnew MyClass(2);
    }
};
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 32
12.11.2014, 20:03  [ТС]
Здорово!
Сработало! Возникли еще вопросы. При таком объявлении
C++
1
MyClass ^mc
объект еще не будет создан? А что будет создано? А если создан, то, по всей видимости, отработает конструктор по умолчанию и mc = null?
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
12.11.2014, 20:26
Как-то этот вопрос обсуждался по отношению к C#, надеюсь, в C++/CLI будет также:
Объект будет создан в управляемой куче по вызову
C++
1
mc = gcnew MyClass(2);
Как легко понять, будет вызван конструктор типа и будет проделана ещё некоторая внутренняя работа (по выделению памяти и др.)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
using namespace System;
 
ref class DummyClass
{
public:
    int x = 0;
};
 
int main(array<System::String ^> ^args) {
    DummyClass^ ds;
    if (ds == nullptr)
        Console::WriteLine("Class now empty");
    return 0;
}
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 32
12.11.2014, 20:49  [ТС]
Спасибо! Многое прояснилось!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2014, 20:49
Помогаю со студенческими работами здесь

Динамическое создание объекта класса
Всем салют. Вопрос такой, кто может подсказать, где я косячу ? ))) Panel^ bar = gcnew Panel(); bar-&gt;Location =...

Взаимодействие объекта самопального класса и формы
Проблема в следующем: Пишу прогу с гуи на WindowsFormAplications (CLR, ясное дело); У меня есть форма, на ней, условно говоря, button и...

Реализовать создание объекта класса с нужными параметрами
Массивы в классе и проблемы с конструкторами Необработанное исключение NullReferenceException, Исключение, возникающее при попытке...

При создании объекта класса ошибки: LNK1120 (неразрешенные внешние элементы), 2001, 2020
При создании объекта класса в методе другого класса ругается: &quot;Неразрешенных внешних элементов - 12&quot;. Была эта же проблема, когда...

Видимость созданного объекта класса в других файлах проекта
Здравствуйте, прошу помочь. знаком с С++, пытаюсь разобраться в С шарп. как и где необходимо создавать объект класса чтоб его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru