Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2011, 22:56   #1
Phallic
 
Регистрация: 10.12.2011
Сообщений: 6
Вопрос Как передать структуру в другой класс?

Привет.
Я хочу передать структуру из функции в одном классе в другой класс. Я могу вызывать функцию, но не знаю, как сохранить структуру, чтобы другие функции класса ее могли использовать.

Так создается структура вначале:
Код:
struct MyStructure{
int id;
std::string name;
} MyList[list_count];
Затем она передается в функцию другого класса (через return instance получаю экземпляр этого класса):
Код:
Class2::reqInstance()->MyFunction(MyList);
Но он ругается на то, что MyStructure из первого класса и MyStructure из Class2 - разные типы.

tl;dr:
Как правильно передать struct из одного класса в другой так, чтобы она была доступна всем функциям другого класса?
Phallic вне форума Ответить с цитированием
Старый 10.12.2011, 23:12   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Вы пытаетесь передать не структуру, а массив структур.
Определитесь, что вам нужно. Если нужно передать одну структуру, то и передавайте одну, если нужен массив, передавайте по указателю

Первый вариант:
Код:
struct T
{
...
};

void Func1(T);

void Func2()
{
  T t;
  Func1(t);
}
Вариант второй:
Код:
struct T
{
...
};

void Func1(std::vector<T>);

void Func2()
{
  std::vector<T> t;
  Func1(t);
}
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария

Последний раз редактировалось Blade; 10.12.2011 в 23:17.
Blade вне форума Ответить с цитированием
Старый 10.12.2011, 23:24   #3
Phallic
 
Регистрация: 10.12.2011
Сообщений: 6
По умолчанию

Спасибо за ответ.

Да, именно массив.
Теперь пишу так:
Код:
->MyFunction(&MyList);
а сама принимающая функция такая:
Код:
void MyFunction(struct MyStructure *MyList)
Ругается на несовпадение типов, будто struct MyStructure разные (no matching function to call... candidates are void Class2::MyFunction(Class2::MyStruct ure)). Я так понял, что нужно объявить одну структуру для этих двух файлов? Или можно как-нибудь перенести ее в другой класс?
Phallic вне форума Ответить с цитированием
Старый 10.12.2011, 23:26   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Покажите весь код
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 10.12.2011, 23:38   #5
Phallic
 
Регистрация: 10.12.2011
Сообщений: 6
По умолчанию

Вообще-то, я изменял имена переменных для удобства.
Функция из класса 1:
Код:
 switch(LoginReply){
        case 1:{
            packet >> charcount;
            struct Chars{
                unsigned int ID;
                std::wstring Name;
            } CharList[charcount];
            for(int i=0; i<charcount; i++){
                packet >> CharList[i].ID;
                packet >> CharList[i].Name;
            }         
            CCharSelect::getInstance()->AddCharacters(&CharList);
Из класса 2:
Код:
class CCharSelect : public States
{
    public:
        struct Chars{
            unsigned int ID;
            std::wstring Name;
        };
//ctor, dtor
        void AddCharacters(struct Chars *CharList){
            std::cout<<"Debug: "<<(int)CharList[0].ID<<std::endl;
        }
Phallic вне форума Ответить с цитированием
Старый 10.12.2011, 23:44   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Блин, как до такого можно было додуматься?
У вас разные структуры, первая имеет тип <Имя_первого_класса>::Chars, вторая CCharSelect::Chars
Объявите структуру не внутри классов.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 11.12.2011, 00:01   #7
Phallic
 
Регистрация: 10.12.2011
Сообщений: 6
По умолчанию


Я создал новый файл global.h

Код:
#ifndef GLOBAL_H_
#define GLOBAL_H_

typedef struct Chars{
    unsigned int ID;
    std::wstring Name;
};
#endif
И заинкладил его в оба класса. Поправил код:
Код:
Chars CharList[charcount];
...
CCharSelect::getInstance()->AddCharacters(&CharList);
Код:
void AddCharacters(Chars* CharList){...
Но ошибка осталась:
Цитата:
no matching function for call to 'CCharSelect::AddCharacters(Chars (*)[(((unsigned int)(((int)charcount) + -0x000000001)) + 1)])
note: candidates are: void CCharSelect::AddCharacters(Chars*)|
Может ли это быть от того, что у меня не указана размерность массива?
Phallic вне форума Ответить с цитированием
Старый 11.12.2011, 00:27   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
CCharSelect::getInstance()->AddCharacters(CharList);
имя массива автоматически приводится к типу указателя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.12.2011, 01:00   #9
Phallic
 
Регистрация: 10.12.2011
Сообщений: 6
По умолчанию

Цитата:
имя массива автоматически приводится к типу указателя
Не знал, спасибо.

Вобщем, надо было писать так:
Код:
void AddCharacters(Chars CharList[]){
Осталась одна проблема. Сделать ее глобальной по классу, чтобы иметь к ней доступ из других функций. Есть идея объявить ее до public части класса, а потом как-нибудь скопировать ее внутри функции AddCharacters.
Phallic вне форума Ответить с цитированием
Старый 11.12.2011, 03:27   #10
Phallic
 
Регистрация: 10.12.2011
Сообщений: 6
По умолчанию

Апдейт.
У меня наистраннейшая проблема при сохранении переменной, полученной из другого класса.
Код:
class CCharSelect : public CState
{
    CHARS MyChars[8]; <-----глобальная структура
    public:
Так вот, при записи в нее:
Код:
        void AddCharacters(CHARS CharList[]){
            for(int i=0; i<sizeof(CharList)-1; i++){
                MyChars[i]=CharList[i];
            }
все нормально, значения MyChars совпадают со значениями CharList. А как только функция прекращает работу, значения MyChars сбрасываются на те, какими они были до записи - случайные:

Во время выполнения AddCharacters они выводятся на экран как и должны. Глобальные переменные не работают?
Phallic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать структуру в поток при _beginthread Ksardas13 Общие вопросы C/C++ 2 10.03.2012 05:00
jsr-184, как передать обьекты с одного мира в другой? Димон0 Java Мобильная разработка (Android) 0 31.08.2011 18:00
Как передать структуру через socket moiav Общие вопросы C/C++ 6 18.05.2011 16:27
Как передать управление из одного объекта в другой? wolf05632 Microsoft Office Word 16 10.04.2011 08:21
прога включающая в себя структуру,класс,массив (горю, выручайте) 9rki Помощь студентам 1 20.05.2010 15:32