Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Выделение памяти под указатель(Глобальный), Глобальный указатель на объект 
:(
    Опции темы
maxi91m
  Дата 22.10.2009, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Никак не пойму почему когда создаю указатель на объект а потом выделяю память конструктор отрабатывает все создает а потом при возвращение к указателю почему то уже его не существует.
В идеале хочу глобальный объект в Form1.h

в SetPower.h содержится конструктор инициализации итд
Код

SetPower::SetPower(int size):MaxPower(size), BitField(size){}
SetPower::SetPower(const SetPower &Set):MaxPower(Set.MaxPower), BitField(Set.BitField){}
SetPower::SetPower(const TBitField &TBitO):MaxPower(),BitField(TBitO){}


Form1.h
Код

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 if( textBox1->Text=="") MessageBox::Show("Не введена мощьность!!!","Ошибка",MessageBoxButtons::OK,MessageBoxIcon::Information);
                 int n=Convert::ToInt32(textBox1->Text);
                 int col=dataGridView1->ColumnCount;
                 if(col>0)
                     for(int i=0; i<col; i++)
                         dataGridView1->Columns->Remove(" ");
                // SetPower SetUni(n);

                 SetMUni=new SetPower(n);//<--конструктор отрабатывает все нор и как только его работа заканчивается то куда то  
                                                                                             //исчизает то что создалось и в указателе SetUMni ничего нет
                 for(int i=0; i<n;i++)
                 {
                     SetMUni->InElem(i);
                     dataGridView1->Columns->Add(" "," ");
                     dataGridView1->Columns[i]->Width=35;
                     dataGridView1[i,0]->Value=Convert::ToString(i);
             }
             }


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  multipower.rar 13,79 Kb
--------------------
PM MAIL ICQ   Вверх
Anikmar
Дата 22.10.2009, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Попробуйте так:
строку SetPower *SetMUni,SetM1(1),SetM2(1); перенесите из h файла в cpp, а в h файле сделайте внешнюю ссылку:
extern SetPower *SetMUni,SetM1(1),SetM2(1);

У вас глобальная переменная определяется с каждым подключением h файла, а вам надо, чтобы она была одна неповторимая.
PM MAIL ICQ   Вверх
maxi91m
Дата 22.10.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Что то я не понял в каком cpp в срр для самого h файла или же в главном срр?

Если я пишу в SetPower.cpp так
то выдает кучу ошибок
Код


#include "stdafx.h"
SetPower *SetMUni,SetM1(1),SetM2(1);
#include "TBitField.h"
#include "SetPower.h"

а если пишу в multipower.cpp то пишет множественная инициализация
Код

// multipower.cpp: главный файл проекта.

#include "stdafx.h"

#include "Form1.h"
#include <conio.h>
#include "TBitField.h"
SetPower *SetMUni,SetM1(1),SetM2(1);
#include "SetPower.h"
#include <ctime>

--------------------
PM MAIL ICQ   Вверх
Anikmar
Дата 22.10.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(maxi91m @  22.10.2009,  09:07 Найти цитируемый пост)
Если я пишу в SetPower.cpp так
то выдает кучу ошибок

Врядли кучу - всего лишь что тип неопределен и т.п.

Итак: в h файле мы ОБЪЯВЛЯЕМ переменную. Т.е. если это глобальная переменная - то extern.... и т.п. Это не создает переменную физически

В c-файле уже физически ОПРЕДЕЛЯЕТСЯ сама переменная без extern

Если в качества типа переменной используется нечто нестандартное, то перед определением переменной ее нужно объявить - т.е. определение должно стоять после подключения хидера с объявлением
PM MAIL ICQ   Вверх
maxi91m
Дата 22.10.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Вот так написал 
в Form1.h
Код

#pragma once
#include "TBitField.h"
#include "SetPower.h"
extern SetPower *SetMUni,SetM1(1),SetM2(1);

в SetPower.cpp
Код

#include "stdafx.h"
#include "TBitField.h"
#include "SetPower.h"
SetPower *SetMUni,SetM1(1),SetM2(1);

Описание функций везде в хидерах

Код

Ошибка    1    error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "BitField"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    10    multipower
Ошибка    2    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\ннгу\яп\си\multipower\multipower\SetPower.h    10    multipower
Ошибка    3    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\ннгу\яп\си\multipower\multipower\SetPower.h    10    multipower
Ошибка    4    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\ннгу\яп\си\multipower\multipower\SetPower.h    14    multipower
Ошибка    5    error C2143: синтаксическая ошибка: отсутствие "," перед "&"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    14    multipower
Ошибка    6    error C2535: SetPower::SetPower(int): функция-член уже определена или объявлена    d:\ннгу\яп\си\multipower\multipower\SetPower.h    14    multipower
Ошибка    7    error C2833: 'operator TBitField' не является распознаваемым оператором или типом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    20    multipower
Ошибка    8    error C2059: синтаксическая ошибка: newline    d:\ннгу\яп\си\multipower\multipower\SetPower.h    20    multipower
Ошибка    9    error C2238: непредвиденные лексемы перед ";"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    20    multipower
Ошибка    10    error C2614: SetPower: недопустимая инициализация члена: 'BitField' не является базовым классом или членом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    31    multipower
Ошибка    11    error C2039: BitField: не является членом "SetPower"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    32    multipower
Ошибка    12    error C2614: SetPower: недопустимая инициализация члена: 'BitField' не является базовым классом или членом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    32    multipower
Ошибка    13    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    14    error C2143: синтаксическая ошибка: отсутствие "," перед "&"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    15    error C2084: функция "SetPower::SetPower(int)" уже имеет текст реализации    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    16    error C2065: TBitO: необъявленный идентификатор    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    17    error C2614: SetPower: недопустимая инициализация члена: 'BitField' не является базовым классом или членом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    18    error C2833: 'operator TBitField' не является распознаваемым оператором или типом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    34    multipower
Ошибка    19    fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции    d:\ннгу\яп\си\multipower\multipower\SetPower.h    35    multipower


--------------------
PM MAIL ICQ   Вверх
Anikmar
Дата 22.10.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



1-я ошибка судя по всему что-то не так в SetPower.h
Остальные тянуться от нее похоже.
Покажите SetPower.h
PM MAIL ICQ   Вверх
maxi91m
Дата 22.10.2009, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Код

#ifndef _SetPower_H_
#define _SetPower_H_

#include "TBitField.h"
typedef int MINT;

class SetPower{
private:
    int MaxPower;
    TBitField BitField;
public:
    SetPower(int size=10);
    SetPower(const SetPower &Set);
    SetPower(const TBitField &TBitO);
    void SetSizeSet(int size);
    void InElem(const int n);
    void DlElem(const int n);
    int  IsMem(const int n);
    int GetMaxPower() const;
     operator TBitField(); 
    int operator==(const SetPower& Set);
    SetPower& operator=(const SetPower& Set);
    SetPower operator+(const int n);
    SetPower operator-(const int n);
    SetPower operator+(const SetPower &Set);
    SetPower operator*(const SetPower &Set);
    SetPower operator-(const SetPower &Set);
    SetPower operator~();
};

SetPower::SetPower(int size):MaxPower(size), BitField(size){}
SetPower::SetPower(const SetPower &Set):MaxPower(Set.MaxPower), BitField(Set.BitField){}
SetPower::SetPower(const TBitField &TBitO):MaxPower(),BitField(TBitO){}
 SetPower::operator TBitField()
{
    TBitField temp(this->BitField);
    return temp;
}
 void SetPower::SetSizeSet(int size)
 {
     SetPower temp(size);
     *(this)=temp;
     
 }
int SetPower::GetMaxPower() const
{
    return MaxPower;
}
void SetPower::InElem(const int n)
{
    BitField.SetBit(n);
}
void SetPower::DlElem(const int n)
{
    BitField.ClearBit(n);
}
int SetPower::IsMem(const int n) 
{
    return BitField.GetBit(n);
}
SetPower& SetPower::operator =(const SetPower &Set)
{
    BitField=Set.BitField;
    MaxPower=Set.MaxPower;
    return *this;
}
int SetPower::operator ==(const SetPower &Set)
{
    return BitField==Set.BitField;
}
SetPower SetPower::operator +(const SetPower &Set)
{
    SetPower temp(BitField | Set.BitField);
        return temp;
    
}
SetPower SetPower::operator*(const SetPower &Set)
{
    SetPower temp(BitField & Set.BitField);
        return temp;
}
SetPower SetPower::operator ~()
{
    SetPower temp(~BitField);
    return temp;
}
#endif

--------------------
PM MAIL ICQ   Вверх
Anikmar
Дата 22.10.2009, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Замечание 1.
typedef  int MINT; 
Должен быть только в одном хидере - он у вас дважды определяется как минимум в #include "TBitField.h"
и следом отдельной строчкой. 
PM MAIL ICQ   Вверх
maxi91m
Дата 22.10.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



убрал  typedef  int MINT;  из SetPower.h
--------------------
PM MAIL ICQ   Вверх
Anikmar
Дата 22.10.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(maxi91m @  22.10.2009,  09:55 Найти цитируемый пост)
убрал  typedef  int MINT;  из SetPower.h 

И? Что теперь компилятор говорит?

Обычно практика такая: убирается первая ошибка, затем смотрим что изменилось. И так до полной победы.
PM MAIL ICQ   Вверх
maxi91m
Дата 22.10.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Все тоже самое
Код

Ошибка    1    error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "BitField"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    10    multipower
Ошибка    2    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\ннгу\яп\си\multipower\multipower\SetPower.h    10    multipower
Ошибка    3    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\ннгу\яп\си\multipower\multipower\SetPower.h    10    multipower
Ошибка    4    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\ннгу\яп\си\multipower\multipower\SetPower.h    14    multipower
Ошибка    5    error C2143: синтаксическая ошибка: отсутствие "," перед "&"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    14    multipower
Ошибка    6    error C2535: SetPower::SetPower(int): функция-член уже определена или объявлена    d:\ннгу\яп\си\multipower\multipower\SetPower.h    14    multipower
Ошибка    7    error C2833: 'operator TBitField' не является распознаваемым оператором или типом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    20    multipower
Ошибка    8    error C2059: синтаксическая ошибка: newline    d:\ннгу\яп\си\multipower\multipower\SetPower.h    20    multipower
Ошибка    9    error C2238: непредвиденные лексемы перед ";"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    20    multipower
Ошибка    10    error C2614: SetPower: недопустимая инициализация члена: 'BitField' не является базовым классом или членом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    31    multipower
Ошибка    11    error C2039: BitField: не является членом "SetPower"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    32    multipower
Ошибка    12    error C2614: SetPower: недопустимая инициализация члена: 'BitField' не является базовым классом или членом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    32    multipower
Ошибка    13    error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    14    error C2143: синтаксическая ошибка: отсутствие "," перед "&"    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    15    error C2084: функция "SetPower::SetPower(int)" уже имеет текст реализации    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    16    error C2065: TBitO: необъявленный идентификатор    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    17    error C2614: SetPower: недопустимая инициализация члена: 'BitField' не является базовым классом или членом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    33    multipower
Ошибка    18    error C2833: 'operator TBitField' не является распознаваемым оператором или типом    d:\ннгу\яп\си\multipower\multipower\SetPower.h    34    multipower
Ошибка    19    fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции    d:\ннгу\яп\си\multipower\multipower\SetPower.h    35    multipower


--------------------
PM MAIL ICQ   Вверх
Anikmar
Дата 22.10.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Там подключается Form1.h
Смотрю Form1.h и вижу в начале
#include "TBitField.h"
#include "SetPower.h"
#include <windows.h>
SetPower *SetMUni,SetM1(1),SetM2(1);

У вас перекрестное подключение хидеров, а это неправильно.

Тут надо использовать либо предварительное объявление  класса либо переносить инклуды в cpp, если они не нужны в хидерах.

Настолько все запутано - уберите лишние инклуды из h-файлов.
Плюч непонятное определение SetPower *SetMUni,SetM1(1),SetM2(1); опять в h файле. Не надо в хидере определять переменные.

PM MAIL ICQ   Вверх
maxi91m
Дата 22.10.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



В таком варианте запускается не не правильно работает. Мне на данный момент важно понять почему  опять же я создаю указатель на объек он создается но потом кудата теряется а указатель остается прежним.

Если делать через extern то какие инклюды делать в SetPower.срр?
я делаю вот так 
#include "TBitField.h"
#include "SetPower.h"
SetPower *SetMUni,SetM1(1),SetM2(1);

Задача состоит в том что бы создать глобальный объект, но так как я не знаю параметра(я получу его только из объекта формы) я хочу создать указатель на объект а потом уже создать сам объект через SetMUni = new SetPower(s);(я же правильно понмаю что тут вызовется конструктор инициализация объекта и создастся нужный мне объект). Так вот я писал просто перед калссом форма указатель(остольные объекты там для того, что бы запускалась программа),
а в классе форма в функции кнопки пишу выделение памяти(как было указано ранее)
Просматриваю отладчиком и вижу, что все нормально создается но вдруг после того как отработали конструкторы и вроде объект создан, отладчик возварщается в функцию и я вижу что указатель указывает на какую то чушь. Никак не могу понять почему, что этому способствуюет?

Это сообщение отредактировал(а) maxi91m - 22.10.2009, 12:23

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  multipower.rar 4,39 Kb
--------------------
PM MAIL ICQ   Вверх
Anikmar
Дата 22.10.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Итак, как я вижу проблему:
файл multipower.cpp - главный файл проекта. в него помещаем глобальную переменную (ваш указатель), который при старте приложения обнуляем.

Далее есть файл form1.h
В нем код главной формы. Лично я никогда не помещаю код в h-файл и вам не советую (если, конечно, другого выхода нет, например шаблоны)
Рекомендую отделить мух от котлет и вынести код в файл cpp

Файл setpower.h
Содержит класс setpower (вместе с реализацией - ну почему не в cpp?!) и использует класс TBitField. Следовательно требует #include <Tbitfield.h> которого там нет, и непонятно как это компилируется

Проверить сам не могу - у меня нет студии.

Теперь высматривается вроде такая иерархия классов:
Главный модуль - должен содержать #include<setpower.h> 
так как в нем (в главном модуле в смысле) находится глобальный указатель и определение собственно глобального указателя. ну и наверное #include <form1.h>

Главная форма. Должна содержать #include<setpower.h>

Объявление глобального указателя можно внести в setpower.h, но это на мой взгляд неправильно. Создайте хидер типа globalvars.h и поместите в него объявление вашего указателя (extern ....) Перед объявлением укажите #include<setpower.h>

Если вам покажется, что некоторые инклуды дублируются - это меньшая проблема. Ваша главная проблема использование h-файлов для реализации. Так делать не надо - вы сами видите билиберду.

ИМХО (мои советы):
Не делайте кода в h файлах, особенно многострочного если только вы не пишете шаблон.
Допускайте реализацию методов класса прямо в объявлении только тогда, когда объявляются методы без тела (например - виртуальные) или содержащии одну строку - например, возвращающие значение закрытого члена. Если вы беспокоитесь об inline - компилятор сам за вас побеспокоится
Для глобальных переменных создавайте отдельный модуль - в cpp определяем в hpp - объявляем через extern
В вашем случае еще введите защиту на повторное создание вашего глобального объекта. Два раза на кнопку ткнули - создали объект второй раз, потеряли предыдущий.


PM MAIL ICQ   Вверх
maxi91m
Дата 22.10.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Программа сейчас запускается он все так же указатель не инициализируется а содержит какой то мусор.


Это сообщение отредактировал(а) maxi91m - 22.10.2009, 19:28

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  multipower.rar 4,78 Kb
--------------------
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.