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

Уточните пожалуста название функции - C++

Восстановить пароль Регистрация
 
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
16.10.2013, 16:51     Уточните пожалуста название функции #1
C++
1
2
3
4
5
6
7
SimpleCat &TheFunction()  //функция возвращяет ссылку на SimpleCat.
 {
SimpleCat * pFrisky = new SimpleCat(5,9);//Если оператор new может успешно выделить требуемый объем памяти, он возвращает указатель на начало области выделенной памяти.
//указатель на SimpleCat и одновременно засылка данных в конструктор
cout << "pFrisky: " << pFrisky << endl;
return *pFrisky; // разименовываем указатель на SimpleCat
 }
Мы обьявили функцию так, что она как бы выдает ссылку на SimpleCat.Верно? А она выдает не ссылку, а просто выдает
SimpleCat, его ведь разименовали. То что мы хотим поиметь ссылку,и имеем видно уже из строки
C++
1
2
3
int main()
 {
SimpleCat & rCat = TheFunction();
а не из самой функции Так правомерно ли такое обьявление?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2013, 16:51     Уточните пожалуста название функции
Посмотрите здесь:

функции,поправьте код пожалуста. C++
C++ Pomogite пожалуста
C++ уточните по функции strlen один момент
atoi, scanf уточните пожалуйста C++
C++ Превращение строки в название исполняемой функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
16.10.2013, 16:56
  #2

Не по теме:

Зачем возвращать ссылку, если есть указатель?

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
16.10.2013, 17:03     Уточните пожалуста название функции #3
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
То что мы хотим поиметь ссылку
А получается, что ссылка поимела нас

Такие вещи надо бы через указатель делать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
SimpleCat* TheFunction() 
{
    SimpleCat * pFrisky = new SimpleCat(5,9);
    cout << "pFrisky: " << pFrisky << endl;
    return pFrisky; // разыменовываем указатель на SimpleCat
 }
 
int main()
{
    SimpleCat* rCat = TheFunction();
    delete rCat;
}
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
16.10.2013, 17:09  [ТС]     Уточните пожалуста название функции #4
Это пример из книги, к стати интересный, вот я его и расматриваю.

Добавлено через 4 минуты
Спасибо. MrGluck , в вашем примере функция выдает, по-моему, указатель, именно указатель на SimpleCat.
rCat- указатель на указатель??
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
16.10.2013, 17:15     Уточните пожалуста название функции #5
Ну потом надо будет не забыть сделать
C++
1
delete &rCat;
что вообщем-то неочевидно, обычно с дин. памятью работают через указатели.

Добавлено через 48 секунд
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
rCat- указатель на указатель??
нет, rCat указатель на SimpleCat. Точно такой же тип возвращает функция TheFunction(SimpleCat*)

Добавлено через 1 минуту
И, кстати, выделения памяти внутри функции без крайней необходимости лучше избегать, очень легко получить утечку памяти, ведь о том, что память выделяется знает лишь создатель этой самой функции
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
16.10.2013, 17:38  [ТС]     Уточните пожалуста название функции #6
Опаньки! Я точно не мастер. Ошбка на ровном месте.

C++
1
2
3
4
5
6
SimpleCat* TheFunction_MrGluck() 
{
    SimpleCat * pFrisky_MrGluck = new SimpleCat(15,9);
    cout << "pFrisky_MrGluck: " << pFrisky_MrGluck << endl;
    return pFrisky_MrGluck; // не разыменовываем указатель на SimpleCat
 }
в майне
C++
1
2
3
 SimpleCat* rCat_MrGluck = TheFunction_MrGluck();
 cout << "rCat_MrGluck: " << rCat_MrGluck << endl;
    delete rCat_MrGluck;
1>d:\проги\primer25\primer25\primerutetsc.cpp(44): error C3861: TheFunction_MrGluck: идентификатор не найден
1> Выход из команды с кодом "2".
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
16.10.2013, 18:01     Уточните пожалуста название функции #7
Dimka-novitsek, а функция до main объявлена?

Добавлено через 42 секунды
для теста, мб кому пригодится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class A
{
  public:
    int x;
    A(int z) : x(z)       { std::cout << "A(" << z << ")";   }
    A(const A& a): x(a.x) { std::cout << "A(A&)"; }
    ~A()                  { std::cout << "~A()";  }
};
 
A& foo()
{
    A* a = new A(2);
    return *a;
}
 
 
int main()
{
    A& a = foo();
    delete &a;
}
Raali
16.10.2013, 18:08
  #8

Не по теме:

для теста - попробуйте скомпилировать это, скопировав себе в IDE

C++
1
2
#include <iostream>
int mаin(){return 0;}

Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
16.10.2013, 21:17  [ТС]     Уточните пожалуста название функции #9
Ну, это скомпилируется. У вас какие-то сомнения!!

Добавлено через 3 минуты
Да, во я баран, я теперь предобьявил ее выше майна. И как же оно компилировалось!!

Добавлено через 2 минуты
Все указатели имеют одинаковое значение!!!!!!!!!!!!!!!!! Вобще!!!!!!!

Добавлено через 4 минуты
Вы понимаете, именно все. ВСЕ!!!!! Все указатели и ссылки указывают на

00345A58
Миниатюры
Уточните пожалуста название функции  
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
16.10.2013, 21:31     Уточните пожалуста название функции #10
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
26
27
28
29
30
31
32
#include <iostream>
 
class A
{
};
 
A* foo()
{
    A* a = new A;
    std::cout << a << std::endl;;
    return a;
}
 
A& foo2()
{
    A* a = new A;
    std::cout << a << std::endl;;
    return *a;
}
 
 
int main()
{
    A* a = foo();
    A* b = foo();
    A& c = foo2();
    A& d = foo2();
    delete a;
    delete b;
    delete &c;
    delete &d;
}

Результат:
Код
0x285f60
0x285f80
0x285fa0
0x286300
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
16.10.2013, 22:53  [ТС]     Уточните пожалуста название функции #11
К стати, а что я ждал? Я же всюду узнаю, где расположен SimpleCat!

Я вот не пойму- я добавил явный деструктор, а тут- ошибка!

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Листинг 9.14.
 // Разрешение проблемы утечки памяти
#include <string> 
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл смело и не раздумывая  вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.
 
 class SimpleCat
 {
public:
SimpleCat (int age, int weight);
~SimpleCat() { }
int GetAge() { return itsAge; }
int GetWeight() { return itsWeight; }
private:
int itsAge;
int itsWeight;
 };
 
 SimpleCat::SimpleCat(int age, int weight)
 {
itsAge = age;
itsWeight = weight;
cout << "Konstruktor:  " << "itsAge " << itsAge <<"itsWeight " <<  itsWeight << endl;
 }
 
SimpleCat::~SimpleCat()
 {
cout << "Simple Cat Destructor...\n";
 }
 
 SimpleCat & TheFunction(); 
 
 SimpleCat* TheFunction_MrGluck() ;
 
 
 
 int main()
 {
SimpleCat Barsic(6,7);
SimpleCat & rCat = TheFunction();
int age = rCat.GetAge();
cout << "rCat " << age << " years old!\n";
cout << "&rCat: " << &rCat << endl;
SimpleCat * pCat = &rCat;
delete pCat;
system("pause  ");
 SimpleCat* rCat_MrGluck = TheFunction_MrGluck();
 cout << "rCat_MrGluck: " << rCat_MrGluck << endl;
    delete rCat_MrGluck;
system("pause  ");return 0;
 }
 
 SimpleCat &TheFunction()  //функция возвращяет ссылку на SimpleCat.
 {
SimpleCat * pFrisky = new SimpleCat(5,9);//Если оператор new может успешно выделить требуемый объем памяти, он возвращает указатель на начало области выделенной памяти.
//указатель на SimpleCat и одновременно засылка данных в конструктор
cout << "pFrisky: " << pFrisky << endl;
return *pFrisky; // разименовываем указатель на SimpleCat
 }
 
 
SimpleCat* TheFunction_MrGluck() 
{
    SimpleCat * pFrisky_MrGluck = new SimpleCat(15,9);
    cout << "pFrisky_MrGluck: " << pFrisky_MrGluck << endl;
    return pFrisky_MrGluck; // не разыменовываем указатель на SimpleCat
 }
utetsc.cpp(44): error C2264: SimpleCat::~SimpleCat: ошибка в определении или объявлении функции; функция не вызвана
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
16.10.2013, 23:35     Уточните пожалуста название функции #12
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
~SimpleCat() { }
в теле класса замените на ~SimpleCat();
Вы дважды пытаетесь определить тело деструктора
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
17.10.2013, 19:45  [ТС]     Уточните пожалуста название функции #13
СПАСИБО!!!

Добавлено через 19 часов 48 минут
Ничего не понимаю!!!!
Начал комментировать прогу, как могу, предложеную уважаемым мистером глюком.
Долго длго думал, переписывал комментарии, думал как же лучше сформулировать. И понял что я таки ничего не понимаю!
Выполнил программу, и вижу что выводы из коутов все разные. Но как же так???????
Ведь это все адрес одного класса А!!!!!!!! я весь выпал из мозга.... Если Женя живет по лермонтова два, то он живет там и только там, а на пушкина четыре живет кто угодно, но не Женя!
За программу спасибо!!
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
26
27
28
29
30
31
32
33
#include <iostream>
 
class A //  класс А
{
};
 
A* foo() //  Функця принадлежит классу А и выдает указатель
{
    A* a = new A; //           присваиваем а указатель на класс А
    std::cout << a << std::endl;; //  выводим а- указатель на класс А
    return a; //  выдаём указатель на класс А  
}
 
A& foo2()  // Функця принадлежит классу А и выдает ссылку
{
    A* a = new A;  //  
    std::cout << a << std::endl;; //  присваиваем а указатель на класс А
    return *a;  // разименовываем и выдаём  класс А  
}
 
 
int main()
{
    A* a = foo(); // указателю а типа класс А присваиваем значение адреса класса А 
    A* b = foo(); // указателю b типа класс А присваиваем значение адреса класса А 
    A& c = foo2(); // ссылке с типа класс А присваиваем значение  класса А 
    A& d = foo2(); // ссылке d типа класс А присваиваем значение  класса А 
    delete a;    //
    delete b;   //
    delete &c;   //
    delete &d;    //
    system("pause  ");
}
Добавлено через 16 минут
Сколько бы раз не вызывалась функция, A* a = new A; // присваиваем а указатель на класс А
ее вызов происходит одинаково. Вызываются конструктор, а потом деструктор. переменные существовавшие в ней уничтожаются при выходе из нее. И неважно, как мы ,,крутим,, и чему присваиваем значениями, из функции выдаваемыми.
Что, после каждого вывода конструктора и деструктора класс А переносится на новый адрес?
наверно, я просто е могу понять, что же в проге делается.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
17.10.2013, 19:50     Уточните пожалуста название функции #14
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Ведь это все адрес одного класса А
поправка: это адрес объектов одного класса
вы же не сможете в одной таре на 5 л хранить и 5 л молока и 5 л воды и 5 л самогонки
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
17.10.2013, 20:21  [ТС]     Уточните пожалуста название функции #15
А где и когда здесь создаются обьекты??
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
17.10.2013, 21:03     Уточните пожалуста название функции #16
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
A* a = new A;
создается указатель на объект a
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
17.10.2013, 22:42  [ТС]     Уточните пожалуста название функции #17
a- это указатель, указатель на первый байт памяти, по которому что-то лежит. Оператор new, который создал нам участок памяти в ,,куче,, применялся к А. А этоу нас класс? Что же лежит по указанному адресу? Как это посмотреть?

Добавлено через 3 минуты
Я ведь искрине думал, что обьект создается примерно так

Cet Friski;

Добавлено через 1 минуту
Почему при выводе внутри функции две точки с запятой?

Добавлено через 5 минут
Скомпилировать таким образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A* foo() //  Функця принадлежит классу А и выдает указатель
{
    A* a = new A; //присваиваем а указатель на класс А;  вычисляется некоторая область динамически распределяемой памяти и ее адрес присваивается указателю.обеспечивающий выделение динамической памяти в куче
    std::cout << a << std::endl;; //  выводим а- указатель на класс А; 
    std::cout << *a << std::endl;; //  выводим а- разименованный указатель на класс А; 
    return a; //  выдаём указатель на класс А  
}
 
A& foo2()  // Функця принадлежит классу А и выдает ссылку
{
    A* a = new A;  // присваиваем а указатель на класс А;  вычисляется некоторая область динамически распределяемой памяти и ее адрес присваивается указателю.обеспечивающий выделение динамической памяти в куче
    std::cout << a << std::endl;; //  присваиваем а указатель на класс А
    std::cout << *a << std::endl;; //  выводим а- разименованный указатель на класс А; 
    return *a;  // разименовываем и выдаём  класс А  
}
я не могу

1>d:\проги\mrgluck _test\mrgluck _test\mrgluck _test.cpp(11): error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "A" (или приемлемое преобразование отсутствует)
1> e:\program files\microsoft visual studio 10.0\vc\include\ostream(679): может быть "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)" [найдено при поиске с зависимостью от аргументов]
1> with
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
17.10.2013, 23:13     Уточните пожалуста название функции #18
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Почему при выводе внутри функции две точки с запятой?
чисто случайно, не заметил лишний символ

Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Скомпилировать таким образом
дело в том, что адрес компилятор вывести может, а сам объект нет т.к. не знает, чем он по сути является. Вы должны либо сами перезагрузить оператор << для данного класса, либо указать преобразование объекта, т.е. как его трактовать. Первый вариант лучше.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2013, 13:10     Уточните пожалуста название функции
Еще ссылки по теме:

C++ Чтение из файла, название передано как параметры функции main argc & argv
C++ Программа предлагает выбрать название страны и выводит на экран её название столицы
C++ Название функции как переменная во время компиляции. Возможно?

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

Или воспользуйтесь поиском по форуму:
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
18.10.2013, 13:10  [ТС]     Уточните пожалуста название функции #19
СПАСИБО!!

Добавлено через 13 часов 18 минут
Вывод из этого остается такой, что при
C++
1
A* a = new A;
оператор new действительно создает участки памяти в куче. И если их сразу же удалять оператором дел, то участок в памяти будет один и тот же, что видимо обусловлено некими свойствами виндовс.

Добавлено через 1 минуту
Или самим оператором new. Или ими обеими, скорее.

Добавлено через 2 минуты
Да, точно. Точно при удалении адрес один.
Yandex
Объявления
18.10.2013, 13:10     Уточните пожалуста название функции
Ответ Создать тему
Опции темы

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