Структура в классе.
#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
Это что касается хедерфайла. А собсно срр такой
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;
ну естессно структуру объявленный класс не видит! Что делать?
ПС. Я не весь класс предоставил (а именно что касается данного вопроса) - это для тех, кто начнет говорить где конструктор и тд. Вообщем кто начнет говорить не по вопросу.
#define _COORD_H_
class Coord
{
private: // <-------------------
struct MapLoad
{
int X; // координата х
int Y; // координата у
int T; // тайл
} ml[256][256]; // сразу объявил структуру
};
#endif
{
int X; // координата х
int Y; // координата у
int T; // тайл
} MapLoad; // сразу объявил структуру
//.................
public:
MapLoad ml[256][256];
Ja tak delal vna4ale, no ja ge ne vigy structuru izvne togda!
Как понять из вне? Ты хочешь получать доступ к переменной из другого класса ? Если да, то почему бы просто не изменить private на public?
Как понять из вне? Ты хочешь получать доступ к переменной из другого класса ? Если да, то почему бы просто не изменить private на public?
Собсно вопрос я задал не совсем верно. Мне нужно добраться до MapLoad.
Т.е. как сохранить структуру в файл в моем случае?
я грубо говоря подключаю класс в программу и делаю вообщем вот что
//.....................
Coord cd;
//.....................
FILE* f;
//fopen
//............
fwrite(&cd.ml[j], // собсно структура
sizeof(struct MapLoad), // вот здесь неверно, компилятор пишет, что MapLoad неопределен
1, F);
//fclose
Собсно вопрос я задал не совсем верно. Мне нужно добраться до MapLoad.
Т.е. как сохранить структуру в файл в моем случае?
я грубо говоря подключаю класс в программу и делаю вообщем вот что
//.....................
Coord cd;
//.....................
FILE* f;
//fopen
//............
fwrite(&cd.ml[j], // собсно структура
sizeof(struct MapLoad), // вот здесь неверно, компилятор пишет, что MapLoad неопределен
1, F);
//fclose
Сейчас пишу на C# и в нём я бы написал нечто подобное следующему коду:
//.....................
Coord cd;
//.....................
FILE* f;
//fopen
//............
fwrite(&cd.ml[j], // собсно структура
sizeof(struct Coord.MapLoad), // вот здесь неверно, компилятор пишет, что MapLoad неопределен
1, F);
//fclose
В C++ наверно надо писать тоже самое.
Сейчас пишу на C# и в нём я бы написал нечто подобное следующему коду:
//.....................
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);
Че-то второй день торможу после праздников )))
Не, так тоже неверно..
Но я тут наугад потыкал, короче структура является вложенной, и типа юзать ее надо вот так
fwrite(&cd.ml[j], sizeof(Coord::MapLoad), 1, F);
Че-то второй день торможу после праздников )))
Ура!!!:D Открыт новый оператор языка С++ "::". А вообще, в C# просто напросто операторы "::" "->" "." заменены точкой, а компилятор уже сам думает где, что лучше подходит...
а так public и :: ... как было уже выше сказано...
[/QUOTE]
Можно и в классе. а за строчки на С# в подобном стиле могут и с работы выгнать =). Напиши человеческие аксессоры и не мучай сам себя отловом багов
Ну я лично пока что не работаю, терять нечего, так что смело спрошу снова.
Я обьявляю структуру. Он у меня как тип переменной, так же как и класс. Если обьявляю класс то должен обьявить так же и переменную типа класса, так же как и структуру. В нашем примере он обьявлял структуру сразу, а мне нужно после, в main-е. Как теперь в main - е добраться то типа структуры, который сам в классе? Просто напишите эти пару строк, обьявите структуру. Спасибо заранее
P.S.
Структуру могу обьявлять и отдельно, но не люблю, когда что то не получается.
для того что бы записать необходимые данные из класса в файл надо добавить в класс метод Serialize ( file ) выполняющий это. Это называется сериализацией.
#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 ) );
}
ну єт так утрировано, я думаю концепция понятна ?
Я обьявляю структуру. Он у меня как тип переменной, так же как и класс. Если обьявляю класс то должен обьявить так же и переменную типа класса, так же как и структуру. В нашем примере он обьявлял структуру сразу, а мне нужно после, в main-е. Как теперь в main - е добраться то типа структуры, который сам в классе? Просто напишите эти пару строк, обьявите структуру. [/QUOTE]
CLASSNAME::STRUCTNAME peremennaya;
а так public и :: ... как было уже выше сказано...
[/QUOTE]данное решение неправильно так нарушает принцип инкапсуляции ООП и делает вообще бессмысленным использование здесь класса.
Классы для того и служат, чтобы скрыть данные.
Если делаешь класс, то нужно скрыть данные в секции private. И например для твоего примера перегрузить оператор индексации []. И добираться до данных с помощью функций(или операторов), которые образуют так называемый интерфейс класса.
{ [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
правильнее будет:
{ [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. Объявление объектов вложенных типов вне класса-контейнера
2. Явное указание обращения к методу/свойству базового класса
{[INDENT]return TBaseClass::Function (params);[/INDENT]}
Кстати, способ 2 позволяет обойти виртуализацию функций :D
Вложенные типы - это не поля, не методы и не свойства - они доступны всегда, несмотря на модификаторы доступа.
[/QUOTE]
Да?
А теперь читаем стандарт:
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]
Плюс в том, что от этих ошибок никто не страдает физически (я надеюсь). :)