Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Структура в классе.

249
05 января 2006 года
DissDoc
639 / / 01.10.2004
Никак не разберусь со структурой в классе. Как лучше ее организовать. Методом тыка везде ее создавал.
Код:
#ifndef _COORD_H_
#define _COORD_H_

class Coord
{
struct MapLoad
{
    int X; // координата х
    int Y; // координата у
    int T; // тайл
} ml[256][256]; // сразу объявил структуру

public:
    // Заполнение структуры
    void GenerateStruct(int, int);
    // Запись данных в структуру
    void PushClick(int, int, int);

private:
    int WIDTH;
    int HEIGHT;
};

#endif

Это что касается хедерфайла. А собсно срр такой
Код:
#include "coord.h"

void Coord::GenerateStruct(int w, int h)
{
    WIDTH = w;
    HEIGHT = h;

    for (int i = 0; i < WIDTH; i++)
    {
        for (int j = 0; j < HEIGHT; j++)
        {
            ml[j].X = i;
            ml[j].Y = j;
            ml[j].T = 0;
        }
    }
}

void Coord:: PushClick(int x, int y, int t)
{
    ml[x][y].X = x;
    ml[x][y].Y = y;
    ml[x][y].T = t;
}

Вот. Ну и в главном срр файле я объявляю Coord cd;
ну естессно структуру объявленный класс не видит! Что делать?

ПС. Я не весь класс предоставил (а именно что касается данного вопроса) - это для тех, кто начнет говорить где конструктор и тд. Вообщем кто начнет говорить не по вопросу.
1.9K
05 января 2006 года
mail0
137 / / 09.05.2005
Код:
#ifndef _COORD_H_
#define _COORD_H_
class Coord
{
private: // <-------------------
struct MapLoad
{
    int X; // координата х
    int Y; // координата у
    int T; // тайл
} ml[256][256]; // сразу объявил структуру

};
#endif
249
05 января 2006 года
DissDoc
639 / / 01.10.2004
Ja tak delal vna4ale, no ja ge ne vigy structuru izvne togda!
249
05 января 2006 года
DissDoc
639 / / 01.10.2004
Все разобрался!
 
Код:
typedef struct  
{
    int X; // координата х
    int Y; // координата у
    int T; // тайл
} MapLoad; // сразу объявил структуру

//.................
public:
  MapLoad ml[256][256];
1.9K
05 января 2006 года
mail0
137 / / 09.05.2005
Цитата:
Originally posted by DissDoc
Ja tak delal vna4ale, no ja ge ne vigy structuru izvne togda!

Как понять из вне? Ты хочешь получать доступ к переменной из другого класса ? Если да, то почему бы просто не изменить private на public?

249
06 января 2006 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by mail0
Как понять из вне? Ты хочешь получать доступ к переменной из другого класса ? Если да, то почему бы просто не изменить private на public?


Собсно вопрос я задал не совсем верно. Мне нужно добраться до MapLoad.
Т.е. как сохранить структуру в файл в моем случае?
я грубо говоря подключаю класс в программу и делаю вообщем вот что

Код:
#include "coord.h"
//.....................
Coord cd;
//.....................
FILE* f;
//fopen
//............
fwrite(&cd.ml[j], // собсно структура
       sizeof(struct MapLoad),  // вот здесь неверно, компилятор пишет, что MapLoad неопределен
       1, F);
//fclose
1.9K
06 января 2006 года
mail0
137 / / 09.05.2005
Цитата:
Originally posted by DissDoc
Собсно вопрос я задал не совсем верно. Мне нужно добраться до MapLoad.
Т.е. как сохранить структуру в файл в моем случае?
я грубо говоря подключаю класс в программу и делаю вообщем вот что
Код:
#include "coord.h"
//.....................
Coord cd;
//.....................
FILE* f;
//fopen
//............
fwrite(&cd.ml[j], // собсно структура
       sizeof(struct MapLoad),  // вот здесь неверно, компилятор пишет, что MapLoad неопределен
       1, F);
//fclose


Сейчас пишу на C# и в нём я бы написал нечто подобное следующему коду:

Код:
#include "coord.h"
//.....................
Coord cd;
//.....................
FILE* f;
//fopen
//............
fwrite(&cd.ml[j], // собсно структура
       sizeof(struct Coord.MapLoad),  // вот здесь неверно, компилятор пишет, что MapLoad неопределен
       1, F);
//fclose

В C++ наверно надо писать тоже самое.
249
06 января 2006 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by mail0
Сейчас пишу на C# и в нём я бы написал нечто подобное следующему коду:
Код:
#include "coord.h"
//.....................
Coord cd;
//.....................
FILE* f;
//fopen
//............
fwrite(&cd.ml[j], // собсно структура
       sizeof(struct Coord.MapLoad),  // вот здесь неверно, компилятор пишет, что MapLoad неопределен
       1, F);
//fclose

В C++ наверно надо писать тоже самое.


Не, так тоже неверно..
Но я тут наугад потыкал, короче структура является вложенной, и типа юзать ее надо вот так
fwrite(&cd.ml[j], sizeof(Coord::MapLoad), 1, F);
Че-то второй день торможу после праздников )))

1.9K
06 января 2006 года
mail0
137 / / 09.05.2005
Цитата:
Originally posted by DissDoc
Не, так тоже неверно..
Но я тут наугад потыкал, короче структура является вложенной, и типа юзать ее надо вот так
fwrite(&cd.ml[j], sizeof(Coord::MapLoad), 1, F);
Че-то второй день торможу после праздников )))

Ура!!!:D Открыт новый оператор языка С++ "::". А вообще, в C# просто напросто операторы "::" "->" "." заменены точкой, а компилятор уже сам думает где, что лучше подходит...

1.7K
21 января 2006 года
alektrik
140 / / 16.01.2006
По моему... само просто было объявить структуру вне класса... и нет проблем!!!
а так public и :: ... как было уже выше сказано...
[/QUOTE]
16K
01 февраля 2006 года
null-sequence
4 / / 01.02.2006
Можно и в классе. а за строчки на С# в подобном стиле могут и с работы выгнать =). Напиши человеческие аксессоры и не мучай сам себя отловом багов
18K
15 мая 2006 года
mitrafaman
1 / / 15.05.2006
Цитата:
Originally posted by null-sequence
Можно и в классе. а за строчки на С# в подобном стиле могут и с работы выгнать =). Напиши человеческие аксессоры и не мучай сам себя отловом багов



Ну я лично пока что не работаю, терять нечего, так что смело спрошу снова.
Я обьявляю структуру. Он у меня как тип переменной, так же как и класс. Если обьявляю класс то должен обьявить так же и переменную типа класса, так же как и структуру. В нашем примере он обьявлял структуру сразу, а мне нужно после, в main-е. Как теперь в main - е добраться то типа структуры, который сам в классе? Просто напишите эти пару строк, обьявите структуру. Спасибо заранее

P.S.
Структуру могу обьявлять и отдельно, но не люблю, когда что то не получается.

351
31 мая 2006 года
PitxBull
633 / / 22.12.2004
для того что бы записать необходимые данные из класса в файл надо добавить в класс метод Serialize ( file ) выполняющий это. Это называется сериализацией.
351
31 мая 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by PitxBull
для того что бы записать необходимые данные из класса в файл надо добавить в класс метод Serialize ( file ) выполняющий это. Это называется сериализацией.



Код:
#ifndef _COORD_H_
#define _COORD_H_

class Coord
{
struct MapLoad
{
    int X; // координата х
    int Y; // координата у
    int T; // тайл
} ml[256][256]; // сразу объявил структуру

public:
    // Заполнение структуры
    void GenerateStruct(int, int);
    // Запись данных в структуру
    void PushClick(int, int, int);

    void Serialize( HANDLE hFile );

private:
    int WIDTH;
    int HEIGHT;
};

#endif

сpp-file

void Coord::Serialize( HANDLE hFile )
{
   WriteToFile( hFile, ml[0][0], sizeof( MapLoad ) );
}


ну єт так утрировано, я думаю концепция понятна ?
562
06 июня 2006 года
tarekon
175 / / 19.08.2003
[QUOTE=mitrafaman]
Я обьявляю структуру. Он у меня как тип переменной, так же как и класс. Если обьявляю класс то должен обьявить так же и переменную типа класса, так же как и структуру. В нашем примере он обьявлял структуру сразу, а мне нужно после, в main-е. Как теперь в main - е добраться то типа структуры, который сам в классе? Просто напишите эти пару строк, обьявите структуру. [/QUOTE]
CLASSNAME::STRUCTNAME peremennaya;
14K
19 июня 2006 года
warchangel
39 / / 17.06.2006
[QUOTE=alektrik]По моему... само просто было объявить структуру вне класса... и нет проблем!!!
а так public и :: ... как было уже выше сказано...
[/QUOTE]данное решение неправильно так нарушает принцип инкапсуляции ООП и делает вообще бессмысленным использование здесь класса.
1.9K
01 июля 2006 года
[*]Frosty
278 / / 17.06.2006
Не понимаю а зачем здесь классы если ты с данными напрямую работаешь?
Классы для того и служат, чтобы скрыть данные.
Если делаешь класс, то нужно скрыть данные в секции private. И например для твоего примера перегрузить оператор индексации []. И добираться до данных с помощью функций(или операторов), которые образуют так называемый интерфейс класса.
309
20 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Некорректный код:
 
Код:
class Coord
{ [INDENT]struct MapLoad
{ [INDENT]int X; // координата х
int Y; // координата у
int T; // тайл [/INDENT]} ml[256][256]; // сразу объявил структуру [/INDENT]public:
...

private: [INDENT]int WIDTH;
int HEIGHT; [/INDENT]};

Не понятно разрешение доступа массива ml :confused: . Конечно, по умолчанию, все элементы класса считаются private, но лучше это указать явным образом чтобы не вводить неопытных программистов в заблуждение :D

правильнее будет:
Код:
class Coord
{ [INDENT]struct MapLoad
{ [INDENT]int X; // координата х
int Y; // координата у
int T; // тайл [/INDENT]} // Объявление структуры, вложенной в класс
[/INDENT]private: [INDENT]int WIDTH;
int HEIGHT;
MapLoad ml[256][256]; // правильное объявление массива
[/INDENT]public:
...
};

Вложенные типы - это не поля, не методы и не свойства - они доступны всегда, несмотря на модификаторы доступа.

[QUOTE=mail0]Originally posted by DissDoc
Цитата:
Не, так тоже неверно..
Но я тут наугад потыкал, короче структура является вложенной, и типа юзать ее надо вот так
fwrite(&cd.ml[j], sizeof(Coord::MapLoad), 1, F);



Че-то второй день торможу после праздников ))) Ура!!! Открыт новый оператор языка С++ "::". А вообще, в C# просто напросто операторы "::" "->" "." заменены точкой, а компилятор уже сам думает где, что лучше подходит...[/QUOTE]
Чего стебётесь, всё правильно. Оператор разрешения доступа "::" используется в следующий способах
1. Объявление объектов вложенных типов вне класса-контейнера

 
Код:
TMyClass::TMyStruct obj;

2. Явное указание обращения к методу/свойству базового класса
 
Код:
TResult TCustomClass::Function (TParams params)
{[INDENT]return TBaseClass::Function (params);[/INDENT]}

Кстати, способ 2 позволяет обойти виртуализацию функций :D
240
20 сентября 2006 года
aks
2.5K / / 14.07.2006
Еще бы на дату обсуждения поглядел =))
3
20 сентября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=el scorpio]
Вложенные типы - это не поля, не методы и не свойства - они доступны всегда, несмотря на модификаторы доступа.
[/QUOTE]
Да?
А теперь читаем стандарт:
Код:
3 Access control is applied uniformly to all names,  whether  the  names
  are  referred to from declarations or expressions.  [Note: access con-
  trol   applies   to   names   nominated   by    friend    declarations
  (_class.friend_) and using-declarations (_namespace.udecl_).  ] In the
  case of overloaded function names, access control is  applied  to  the
  function  selected by overload resolution.  [Note: because access con-
  trol applies to names, if access control is applied to a typedef name,
  only  the accessibility of the typedef name itself is considered.  The
  accessibility of the entity referred to by the typedef is not  consid-
  ered.  For example,
          class A
          {
                  class B { };
          public:
                  typedef B BB;
          };

          void f()
          {
                  A::BB x; // ok, typedef name A::BB is public
                  A::B y;  // access error, A::B is private
          }
   --end note]
309
20 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Сознаю свою вину, меру, степень, глубину :(
3
20 сентября 2006 года
Green
4.8K / / 20.01.2000
Ничего, все ошибаются.
Плюс в том, что от этих ошибок никто не страдает физически (я надеюсь). :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог