Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
#1

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

18.11.2011, 06:57. Просмотров 708. Ответов 15
Метки нет (Все метки)

Доброе утро, форум.

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

файл 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(); 
}
Не сплю второй день, голова совсем не работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2011, 06:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Классы. Доступ к созданному объекту. (C++):

Почему допустимо создавать объект по другому объекту, но нельзя присваивать уже созданный объект, другому созданному объекту? - C++
Это можно : Array a(10); a.set(0,5); Array b(a); А это нельзя : Array a(10); Array b(20); a = b;

Доступ к объекту базового класса при закрытом наследовании - C++
Есть класс Pair из стандартной библиотеки. Он у меня содержит 2 массива valarray. От класса Pair я создаю наследника Wine. В классе Wine...

Бинарное дерево подклассов основного класса-узла. Доступ к подклассам по указателю - объекту класса-родителя - C++
Короче, необходимо сделать бинарное дерево, решающее арифметическое выражение, предварительно туда записанное. Есть основной класс...

Классы С++, получить доступ из одного класса к элементам другого - C++
Здравствуйте! Объясните пожалуйста, вот имеется у меня два класса,например вот такие: Class A { private: int i; }

Перечислить способы (например, библиотечные классы, функции), обеспечивающие доступ к функциональным клавишам - C++
Добрый день ! Помню давно для проверки нажатия клавиш использовал функцию bioskey как оказалось в вижуале 8 она не работает. ...

Непонятна тема (Классы содержащие другие классы, как данные члены ) - C++
Изучаю книгу Джесс Либерти(в частности эту главу в данный момент) #include &lt;iostream&gt; class Point { public: void SetX(int...

15
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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();
1
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 07:11  [ТС] #3
Благодарю, я пост немного отредактировал.
Сейчас подумаю немного, и отвечу.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
18.11.2011, 07:11 #4
Нафига тебе файл book.cpp если все что относится к классу Book ты делаешь в book.h?
Как это ты глобально непонятно где выделил память под Book...у тебя кажись даже компилятор такое не пропустит....
C++
1
2
Book* abc = new Book();
abc->SetMaxPages(777);
перенеси в main
И вообще не понятно что ты сделать то хочешь в итоге? чисто потренироваться?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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;
}
0
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(); 
}
Проблема тут очевидна. Ну вы поняли чего я хочу добиться.
Подскажите пожалуйста как решить проблему
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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; } // сумасшедший бред
}
0
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(); 
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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 минуту
Но! Это у тебя всего одна книга может быть. Так что у тебя в архитектуре ошибка.
Лучше скажи, что тебе действительно нужно, потому что то что ты в коде сделал, явно не то, что ты на самом деле хочешь.
0
Bers
Заблокирован
18.11.2011, 08:25 #10
Цитата Сообщение от res Посмотреть сообщение
Deviaphan, Тоесть, если мне не нужны новые объекты, а только один GetAbcBook, то мне нужно создать "а-ля Singleton", чтобы управлять объектом как захочу?
У вас, судя по приведенному коду, просится объект статик-мембер. Причем, полностью независимый от работы самого класса, внутри которого он живёт.
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 08:25  [ТС] #11
>Это у тебя всего одна книга может быть.
Так мне так и нужно, я просто пример не удачно привёл.
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 08:27  [ТС] #12
Просто если создам глобальный экземпляр в book.h, то компоновщик не съест.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.11.2011, 08:28 #13
Цитата Сообщение от res Посмотреть сообщение
Так мне так и нужно, я просто пример не удачно привёл.
Тогда почитай про синглтон. Тут тебе нужно сделать закрытый конструктор и вместо static Book* использовать static std::auto_ptr<Book> как минимум.
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
18.11.2011, 08:35  [ТС] #14
Вот я использую библиотеку ACE, там как-раз есть такое.
C++
1
ACE_Singleton< Объект , ACE_Null_Mutex>::instance()
Сейчас покопаюсь.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.11.2011, 08:37 #15
ACE_Singleton< Book , ACE_Null_Mutex>::instance()
1
18.11.2011, 08:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2011, 08:37
Привет! Вот еще темы с ответами:

Программа по классам, которая использует классы точек и прямых на плоскости, а, возможно, и другие классы - C++
Нужно написать программу, которая использует классы точек и прямых на плоскости, а, возможно, и другие классы. Реализовать её нужно в трех...

Наследование, базовые классы и производные классы - C++
Добрый вечер.Задание: необходимо разработать поля и методы наследуемые из базового класса и собственные компоненты производных...

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.) - C++
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию...

классы/дочерние классы/методы - C++
помогите пожалуйста! надо что выводились только учебеники. чтоб былo через GetTip. h файл class Book { protected: char...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru