-1 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 14
1

Как обьявить статические поля класса в глобальной области?

16.12.2015, 18:14. Показов 3203. Ответов 10
Метки нет (Все метки)

У класса есть статическое поле, определение должно находиться за пределами объявления класса. Как мне это сделать?
C++
1
2
3
4
5
6
using namespace System;
 
ref class Film {
public:
    static IDictionary<Int16, String^>^ ganres;
};
Когда пишу за пределами класса:
C++
1
IDictionary<Int16, String^> Film::ganres = gcnew IDictionary<Int16, String^>();
Выдает ошибку: "Ошибка: Переменная со статической длительностью хранения не может быть дескриптором или относиться к типу отслеживаемой ссылки"
Как мне объявить статическое поле типу коллекции IDictionary?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2015, 18:14
Ответы с готовыми решениями:

Как правильно инициализировать статические поля класса
Здравствуйте, уважаемые форумчане! Столкнулся с проблемой, решение нашел, но идею еще нужно...

Видимость констант из глобальной области внутри класса
#include &lt;iostream&gt; //stack struct struct node; struct node { int* val; node* prev;...

Статические поля класса
Не подскажете как инициализировать статический массив? Но чтобы я сам мог ввести этот массив.

Статические поля класса
class mi { int a,b; public: mi(int a, int b) : a(a),b(b) {} void sw() {...

10
Администратор
Эксперт .NET
9161 / 4438 / 749
Регистрация: 17.04.2012
Сообщений: 9,226
Записей в блоге: 14
20.12.2015, 10:54 2
 Комментарий модератора 
Naksiboy, не дублируйте темы.
За следующий дубль получите карту.


По теме: в коде много проблем. Во-первых: использование статических (в CLR-смысле) переменных как глобальных запрещено и не имеет смысла. К статической переменной можно обратиться, не создавая экземпляр класса
C++
1
auto g = Film::ganres;
Во-вторых, gcnew создаёт управляемые указатели, их нужно обозначать шапкой (^). В-третьих, создать экземпляр интерфейса (которым является IDictionary`2) невозможно. Интерфейс - это соглашение между пользователем кода и его автором, он не содержит реализации. Можно использовать приведение типов
C++
1
IDictionary<Int16, String^>^ ganres = gcnew Dictionary<Int16, String^>();
1
-1 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 14
20.12.2015, 20:39  [ТС] 3
А можно создать коллекцию Dictionary(или ArrayList) со своим типом Type_A?
Что-то вроде(Только у меня выдает ошибку):
C++
1
IDictionary<Int16, Type_A>^ ganres = gcnew Dictionary<Int16, String^>();
0
Администратор
Эксперт .NET
9161 / 4438 / 749
Регистрация: 17.04.2012
Сообщений: 9,226
Записей в блоге: 14
20.12.2015, 20:51 4
Давайте пока отвлекёмся от использования IDictionary, к тому же, не совсем ясно, зачем использовать именно интерфейс. В примерах буду указывать простой словарь (Dictionary`2)

Да, можно хранить экземпляры своего класса, но нужно указывать соответствующий конструктор
C++
1
Dictionary<Int16, Type_A^>^ ganres = gcnew Dictionary<Int16, Type_A^>();
Если Type_A - ссылочный (объявлен как ref class).
Цитата Сообщение от Naksiboy Посмотреть сообщение
ArrayList
Не рекомендую использовать этот тип, если нужен список, есть List<T>
1
-1 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 14
20.12.2015, 21:44  [ТС] 5
Спасибо. Type_A не ссылочный. Честно говоря он вообще написаный в .h файле с пространством имён ::std.
У меня есть "логика" программы(если это так можно назвать) - она написана в пространстве имен ::std и есть графический интерфейс Windows Forms - namespace ::System. Как мне организовать их взаимодействие. Я пытаюсь написать класс что-то вроде адаптера, но вот не получается.
Например, метод который вместо поля класса std::vector будет возвращать коллекцию с пространства имен System(В данном случае ArrayList)
C++
1
2
3
4
5
6
System::Collections::ArrayList^ get_List_Films() {
        System::Collections::ArrayList^ myAL = gcnew System::Collections::ArrayList;
        for each(Film var in ListF->get_List_Films) {
            myAL->Add(var);
        }
    };
Выдает ошибку.. Помогите настроить взаимодействие.

Добавлено через 1 минуту
tezaurismosis, И вообще возможно ли организовать взаимодействие?
0
Администратор
Эксперт .NET
9161 / 4438 / 749
Регистрация: 17.04.2012
Сообщений: 9,226
Записей в блоге: 14
20.12.2015, 23:09 6
Naksiboy, пока суть не до конца ясна, приведите побольше кода.
Если тип, который вы хотите хранить в списке, написан для чистого C++ (т.е. неуправляемый, без слов ref или value в сигнатуре), то для него придётся писать тип-обёртку - неуправляемые типы нельзя хранить в управляемых объектах.
1
-1 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 14
20.12.2015, 23:12  [ТС] 7
tezaurismosis, Можно вам в ЛС написать?? Там кода много и это кажется будет не по теме форума.
0
Администратор
Эксперт .NET
9161 / 4438 / 749
Регистрация: 17.04.2012
Сообщений: 9,226
Записей в блоге: 14
20.12.2015, 23:16 8
Naksiboy, не стоит.
Весь код приводить не нужно, только классы, которые вы хотите использовать из форм. Необязательно всю реализацию, меня интересует декларация класса и пара-тройка используемых методов или полей.
Всё равно с проектом я ничего сейчас не сделаю, я на линуксе.
0
-1 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 14
20.12.2015, 23:26  [ТС] 9
tezaurismosis, Хорошо, вот часть кода:
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
class Film {
private:
    int ganre;
    int country;
    string name;////
    int year;//
    string producer;////
    vector<string> main_actors;//
    int amount_actors;//
    string link_to_file;//
    float personal_rating;//
 
public:
    void set_name(string str) {
        this->name = str;
    };
    string get_name() {
        return this->name;
    };
    void set_producer(string str) {
        this->producer = str;
    };
    string get_producer() {
        return this->producer;
    };
//
//И ещё много сеттеров и геттеров
static int ini_ganres_country(void);
    static multimap<int, string> ganres;
void AddGanre(string Name);
}
multimap<int, string> Film::ganres;
multimap<int, string> Film::countries;
void Film::AddGanre(string Name) {
    int last_number;
    auto it = Film::ganres.rend();
    it++;
    last_number = it->first;
    last_number++;
    ofstream fout("ganres.txt", ios_base::app);
    fout << endl;
    fout << last_number << " " << Name;
    fout.close();
    Film::ganres.emplace(last_number, Name);
}
class ListOfFilms {
private:
    vector<Film> films;
public:
    ListOfFilms() {
        ini_catalog();
    };
    ~ListOfFilms() {
        films.clear();
    }
    vector<Film> get_List_Films() {
        return this->films;
    };
    void AddFilm(string Name, string Ganre, int Year, string Country, string Producer, vector<string> Actors, string link_, double Rating);
    void ini_catalog();
};
void ListOfFilms::ini_catalog() {
    ifstream fin("Catalogue.txt");
    while (!fin.eof()) {
        Film *temp = new Film();
        fin.ignore(fin.rdbuf()->in_avail(), '\n');//'\n' - игнорю всё до \n, иначе не работает!
        string temp_str;//строка-буфер для записи разных значений
        getline(fin, temp_str);
        temp->set_name(temp_str);
        int a, b;
        fin >> a;
        temp->set_ganre(a);
        int year_a;
        fin >> year_a;
        temp->set_year(year_a);
        fin >> b;
        temp->set_country(b);
        fin.ignore(fin.rdbuf()->in_avail(), '\n');
        getline(fin, temp_str);
        temp->set_producer(temp_str);
        getline(fin, temp_str);
        temp->set_linkToFile(temp_str);
        float temp_rait;
        fin >> temp_rait;
        temp->set_personalRating(temp_rait);
        int temp_amount;
        fin >> temp_amount;
        temp->set_amountActors(temp_amount);
 
        for (int i = 0; i < temp->get_amountActors(); i++) {
            string str;
            if (!i)
                fin.ignore(fin.rdbuf()->in_avail(), '\n');
            getline(fin, str);
            temp->set_mainActors(str);
        }
        //auto it = temp->main_actors.begin(); -- хз зачем писал эту строчку
        if(temp->get_name() != "")
        films.push_back(*temp);
        delete temp;
    }
    fin.close();
}
 
void ListOfFilms::AddFilm(string Name, string Ganre, int Year, string Country, string Producer, vector<string> Actors, string link_, double Rating) {
    Film *temp = new Film(Name, Ganre, Year, Country, Producer, Actors, link_, Rating);
    films.push_back(*temp);
    ofstream fout("Catalogue.txt", ios_base::app);
    fout << temp->get_name() << endl;
    fout << temp->get_ganre() << endl;
    fout << temp->get_year() << endl;
    fout << temp->get_country() << endl;
    fout << temp->get_producer() << endl;
    fout << temp->get_linkToFile() << endl;
    fout << temp->get_personalRating() << endl;
    fout << temp->get_amountActors() << endl;
    vector<string>::iterator it = (temp->get_mainActors()).begin();
    for (int i = temp->get_amountActors(); i > 0; i--) {
        fout << *it << endl;
        it++;
    }
    fout << endl;
    fout.close();
    delete temp;
}
Там еще методы есть.. Это всё нужно подключить к графическому интерфейсу Win Forms. Посоветуйте что-нибудь

Добавлено через 1 минуту
tezaurismosis, Есть класс Film и есть класс ListOfFilms список фильмов. Оперировать нужно Списком фильмов.
0
Администратор
Эксперт .NET
9161 / 4438 / 749
Регистрация: 17.04.2012
Сообщений: 9,226
Записей в блоге: 14
21.12.2015, 15:04 10
Чтобы весь код не переписывать, можно даже тип-оболочку не делать, а пойти иным путём.
К примеру, вам нужно только вывести список фильмов. Пусть на форме для этого есть listBox1
Ничего не меняете в своём коде, получаете список как есть
C++
1
2
3
4
5
6
vector<Film> films = (new ListOfFilms()).get_List_Films();
for (auto& film : films) {
    std::string name = film->get_name();
    String^ managedName = gcnew String(name.c_str());
    listBox1.Items.Add(managedName);
}
Т.е. идея такая - вся сортировка, выбор по жанрам и прочее взаимодействие - кодом на чистых плюсах, в стиле уже имеющегося у вас кодда - через векторы и проч. Если нужно что-то вывести - то как в примере
1
-1 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 14
23.12.2015, 04:09  [ТС] 11
tezaurismosis, Спасибо большое. Выводит всё отлично.

Добавлено через 17 минут
Цитата Сообщение от tezaurismosis Посмотреть сообщение
К статической переменной можно обратиться, не создавая экземпляр класса
C++
1
auto g = Film::ganres;
tezaurismosis, обратится так не получается со второй формы. Есть Форма1(Основная) и Форма2, когда в Форме2 пишу
C++
1
auto g = Film::ganres;
Выдаёт ошибку:C2653 Film: не является именем класса или пространства имен. С2065 ganres: необъявленный идентификатор. Возможно это из-за того что я в Форм2 не подключил .h-файл с определениями классов Film и ListOfFilms, но когда я его подключаю, то эти ошибки пропадают, а появляется ошибка средств компоновщика LNK2005(эта ошибка остаётся даже если стереть "auto g = Film::ganres;" и просто подключить .h-файл классов Film и ListOfFilms).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2015, 04:09

Qt creator статические поля класса
Я создал в классе статическую переменную типа int static float speed; И когда я из...

Указатели на статические поля класса C++
Необходимо создать класс в public поле которого необходимо создать указатели на все элементы...

Не статические поля в статическом методе класса
Здравствуйте, друзья. Подскажите пожалуйста как &quot;обойти запрет&quot; использования не статических полей...

Почему переменная не увеличивается при добавлении константы в конструкторе(статические поля класса)?
Всем привет! Учу статические поля класса (книга Лафоре). Простой пример, который работает. При...

Как инициализировать статические члены класса
Помогите пожалуйста....я не знаю как вывести в статическое поле значения((( #include &lt;conio.h&gt; ...

Как работают конструктор и статические поля в этом коде?
using System; namespace Test_C_{ class Entity{ static int nextSerialNo; int serialNo;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.