Форум программистов, компьютерный форум CyberForum.ru

Классы. Доступ к созданному объекту. - C++

Восстановить пароль Регистрация
 
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 06:57     Классы. Доступ к созданному объекту. #1
Доброе утро, форум.

Имеется код, чисто для примера.

файл book.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef BOOK_H
#define BOOK_H
 
struct Book
{
    void SetMaxPages(int max) { itsMaxPages = max; }
    int GetMaxPages() const { return itsMaxPages; }
private:
    int itsMaxPages;
};
#endif
файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "book.h"
#include <iostream>
 
void Call()
{
    Book* abc = new Book();
    abc->SetMaxPages(777);
}
 
void main()
{
    Call();
    // вот тут нужно получить созданный в Call объект abc. Как?
    Book* isAbc = ....
    std::cout << isAbc.GetMaxPages(); // должен вернуть 777
    std::cin.get(); 
}
Не сплю второй день, голова совсем не работает.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.11.2011, 07:08     Классы. Доступ к созданному объекту. #2
Либо
C++
1
2
Book isAbc;
    std::cout << itAbc.GetMaxPages(); // должен вернуть 777
либо
C++
1
2
Book* isAbc = new Book;
    std::cout << itAbc->GetMaxPages(); // должен вернуть 777
Т.е. помимо прочего обрати внимание на "." и "->".

Добавлено через 54 секунды
И ответ на вопрос
C++
1
2
3
4
5
6
7
8
9
10
Book * Call()
{
    Book* abc = new Book();
    abc->SetMaxPages(777);
    return abc;
}
 
...
 
Book * book = Call();
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 07:11  [ТС]     Классы. Доступ к созданному объекту. #3
Благодарю, я пост немного отредактировал.
Сейчас подумаю немного, и отвечу.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
18.11.2011, 07:11     Классы. Доступ к созданному объекту. #4
Нафига тебе файл book.cpp если все что относится к классу Book ты делаешь в book.h?
Как это ты глобально непонятно где выделил память под Book...у тебя кажись даже компилятор такое не пропустит....
C++
1
2
Book* abc = new Book();
abc->SetMaxPages(777);
перенеси в main
И вообще не понятно что ты сделать то хочешь в итоге? чисто потренироваться?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.11.2011, 07:16     Классы. Доступ к созданному объекту. #5
Чтобы не запутался от моего предыдущего поста.)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#include "book.h"
#include <iostream>
 
Book * Call()
{
    Book* abc = new Book();
    abc->SetMaxPages(777);
    return abc;
}
 
void main()
{
    Book* isAbc = Call();
    std::cout << isAbc->GetMaxPages();
    std::cin.get(); 
 
    delete isAbc;
}
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 07:40  [ТС]     Классы. Доступ к созданному объекту. #6
Спасибо, но ваш метод создает новый объект при вызове?

Например если я сделаю статический GetMainBook().
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef BOOK_H
#define BOOK_H
 
struct Book
{
        void SetMaxPages(int max) { itsMaxPages = max; }
        int GetMaxPages() const { return itsMaxPages; }
        static Book* GetMainBook()
        { 
            Book* book = new Book; 
            book->SetMaxPages(777);
            return book; // сумасшедший бред
         }
private:
        int itsMaxPages;
};
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void SensMessages()
{
    Book* mainBook = Book::GetMainBook();
    std::cout << mainBook->GetMaxPages() << std::endl;
}
 
// обновляем внешне
void UpdateMaxPages(int max)
{
    Book* mainBook = Book::GetMainBook();
    mainBook->SetMaxPages(max);
}
 
void main()
{
    SendMessages();
    UpdateMaxPages(666);
    SendMessages(); // должен вернуть 666
    std::cin.get(); 
}
Проблема тут очевидна. Ну вы поняли чего я хочу добиться.
Подскажите пожалуйста как решить проблему
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.11.2011, 07:43     Классы. Доступ к созданному объекту. #7
Судя по примеру, тебе нужен а-ля синглтон.
C++
1
2
3
4
5
6
7
8
9
10
static Book* GetBook
{
   static Book* book = 0;
  if( !book )
  {
         book = new Book;
         book->SetMaxPages(777);
   }
return book; } // сумасшедший бред
}
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 08:07  [ТС]     Классы. Доступ к созданному объекту. #8
обновил пост

Добавлено через 4 минуты
vitaly1981, У меня просто есть очень большой скрипт для одного движка, поэтому привожу на более понятном примере.


Deviaphan, Хм... пошёл снова думать.

Добавлено через 14 минут
Deviaphan, Тоесть, если мне не нужны новые объекты, а только один GetAbcBook, то мне нужно создать "а-ля Singleton", чтобы управлять объектом как захочу?
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef BOOK_H
#define BOOK_H
 
struct Book
{
        void SetMaxPages(int max) { itsMaxPages = max; }
        int GetMaxPages() const { return itsMaxPages; }
        static Book* GetAbcBook()
        { 
            static Book* book = 0;
            if(!book)
                new Book;
            return book; // сумасшедший бред
         }
private:
        int itsMaxPages;
};
#endif
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
#include <iostream>
#include "book.h"
 
void SensMessages()
{
    Book* mainBook = Book::GetAbcBook();
    std::cout << mainBook->GetMaxPages() << std::endl;
}
 
// обновляем внешне
void UpdateMaxPages(int max)
{
    Book* mainBook = Book::GetAbcBook();
    mainBook->SetMaxPages(max);
}
 
void main()
{
    Book* itsAbc = Book::GetAbcBook();
    itsAbc->SetMaxPages(777);
    SendMessages(); // 777
    UpdateMaxPages(666);
    SendMessages(); //666
    std::cin.get(); 
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.11.2011, 08:17     Классы. Доступ к созданному объекту. #9
А ещё почитать что-нибудь по программированию.)
C++
1
2
3
4
5
6
7
 static Book* GetAbcBook()
        { 
            static Book* book = 0;
            if(!book)
               book = new Book;
            return book; // сумасшедший бред
         }
Будет создана ОДИН раз и потом всегда будет возвращать тот самый первый экземпляр.

Добавлено через 1 минуту
Но! Это у тебя всего одна книга может быть. Так что у тебя в архитектуре ошибка.
Лучше скажи, что тебе действительно нужно, потому что то что ты в коде сделал, явно не то, что ты на самом деле хочешь.
Bers
Заблокирован
18.11.2011, 08:25     Классы. Доступ к созданному объекту. #10
Цитата Сообщение от res Посмотреть сообщение
Deviaphan, Тоесть, если мне не нужны новые объекты, а только один GetAbcBook, то мне нужно создать "а-ля Singleton", чтобы управлять объектом как захочу?
У вас, судя по приведенному коду, просится объект статик-мембер. Причем, полностью независимый от работы самого класса, внутри которого он живёт.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 08:25  [ТС]     Классы. Доступ к созданному объекту. #11
>Это у тебя всего одна книга может быть.
Так мне так и нужно, я просто пример не удачно привёл.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 08:27  [ТС]     Классы. Доступ к созданному объекту. #12
Просто если создам глобальный экземпляр в book.h, то компоновщик не съест.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.11.2011, 08:28     Классы. Доступ к созданному объекту. #13
Цитата Сообщение от res Посмотреть сообщение
Так мне так и нужно, я просто пример не удачно привёл.
Тогда почитай про синглтон. Тут тебе нужно сделать закрытый конструктор и вместо static Book* использовать static std::auto_ptr<Book> как минимум.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 08:35  [ТС]     Классы. Доступ к созданному объекту. #14
Вот я использую библиотеку ACE, там как-раз есть такое.
C++
1
ACE_Singleton< Объект , ACE_Null_Mutex>::instance()
Сейчас покопаюсь.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.11.2011, 08:37     Классы. Доступ к созданному объекту. #15
ACE_Singleton< Book , ACE_Null_Mutex>::instance()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2011, 08:52     Классы. Доступ к созданному объекту.
Еще ссылки по теме:

вылетает программа при обращении к объекту класса C++
C++ при повторном "обращении" к заранее созданному массиву последний элемент отображается неверно
C++ Подключиться к COM-объекту, вызвать функции и прочитать таблицы

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

Или воспользуйтесь поиском по форуму:
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 08:52  [ТС]     Классы. Доступ к созданному объекту. #16
Спасибо, это именно то что нужно было.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef BOOK_H
#define BOOK_H
#include <ace/Singleton.h>
struct Book
{
        ~Book() {}
        void SetMaxPages(int max) { itsMaxPages = max; }
        int GetMaxPages() const { return itsMaxPages; }
private:
        Book() {} // спрятал
        friend class ACE_Singleton<Book, ACE_Null_Mutex>;
        int itsMaxPages;
};
 
#define sBookMgr ACE_Singleton<Book, ACE_Null_Mutex>::instance()
#endif
Yandex
Объявления
18.11.2011, 08:52     Классы. Доступ к созданному объекту.
Ответ Создать тему
Опции темы

Текущее время: 14:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru