powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где глюк?
33 сообщений из 33, показаны все 2 страниц
Где глюк?
    #34127148
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот небольшой пример:
Код: plaintext
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.
#include <iostream>

class A
{
public:
	 A(){std::cout << "constructor class A\n"; }
};

template<typename T> 
class B
{
public:
	B(T x): x_(x) {std::cout << "constructor class B\n"; } 
	T x_;
};

int main()
{
	std::cout << "b1 begin\n";
	A a;
	B<A> b1(a);
	std::cout << "b1 end\n";
	
	std::cout << "b2 begin\n";
	B<A> b2(A());
	std::cout << "b2 end\n";
вот резуультат работы программы:
b1 begin
constructor class A
constructor class B
b1 end
b2 begin
b2 end

Не пойму почему объект b2 не создается, где тут ошибка?
компилятор gcc version 4.0.2
...
Рейтинг: 0 / 0
Где глюк?
    #34127188
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем так писать?

B<A> b2(A());
...
Рейтинг: 0 / 0
Где глюк?
    #34127203
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА зачем так писать?

B<A> b2(A());
Так что в этой строке не так?
...
Рейтинг: 0 / 0
Где глюк?
    #34127276
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже что компилятор воспринимает строку
B<A> b2(A());
как объявление прототипа функции, которая принимает тип A (*)() , т. е. указатель на функцию, возвращающую А,
и возвращает тип B<A>

Но разве такое поведение компилятора правильное?
...
Рейтинг: 0 / 0
Где глюк?
    #34127317
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KНо разве такое поведение компилятора правильное?

Именно
...
Рейтинг: 0 / 0
Где глюк?
    #34127361
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZrenBy Sandro_KНо разве такое поведение компилятора правильное?

Именно

Получается что в конструктор невозможно передать объект не создавая временного объекта?
...
Рейтинг: 0 / 0
Где глюк?
    #34127417
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря... даже не знаю. Могу предположить, что конструктор срабатывает раньше чем вход в процедуру main.
...
Рейтинг: 0 / 0
Где глюк?
    #34127435
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KПолучается что в конструктор невозможно передать объект не создавая временного объекта?жжош
...
Рейтинг: 0 / 0
Где глюк?
    #34127446
Получается что в конструктор невозможно передать объект не создавая временного объекта?

так работает:

B<A> b2 = A();

или так:

B<A> b2( static_cast<A>( A() ) );

возможно, еще как-нить..
...
Рейтинг: 0 / 0
Где глюк?
    #34127453
временный объект, разумеется, создается по-любому
вот только skope различный
...
Рейтинг: 0 / 0
Где глюк?
    #34127497
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ты добавь ещё ~A(){std::cout << "destructor class A\n"; } и смотри, какой творится пир духа.
...
Рейтинг: 0 / 0
Где глюк?
    #34127499
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Sandro_KПолучается что в конструктор невозможно передать объект не создавая временного объекта?жжош
И в чем я тут отжог? Че-то до меня не доходит
...
Рейтинг: 0 / 0
Где глюк?
    #34127540
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KВот небольшой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	A a;     // конструктор вызывается здесь
	B<A> b1(a);  
	std::cout << "b1 end\n";
	
	std::cout << "b2 begin\n";
	B<A> b2(A());    // A - тип,  а не обьект типа A,
                                    // IMHO при дальнейшем использовании b2 ваша программа с очень большой вероятность упадет  в кору.
	std::cout << "b2 end\n";
вот резуультат работы программы:
b1 begin
constructor class A
constructor class B
b1 end
b2 begin
b2 end

Не пойму почему объект b2 не создается, где тут ошибка?
компилятор gcc version 4.0.2


У меня тоже есть вопрос:
Почему компилятор пропустил такую инициализацию b2?
...
Рейтинг: 0 / 0
Где глюк?
    #34127563
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Sandro_KВот небольшой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	A a;     // конструктор вызывается здесь
	B<A> b1(a);  
	std::cout << "b1 end\n";
	
	std::cout << "b2 begin\n";
	B<A> b2(A());    // A - тип,  а не обьект типа A,
                                    // IMHO при дальнейшем использовании b2 ваша программа с очень большой вероятность упадет  в кору.
	std::cout << "b2 end\n";
вот резуультат работы программы:
b1 begin
constructor class A
constructor class B
b1 end
b2 begin
b2 end

Не пойму почему объект b2 не создается, где тут ошибка?
компилятор gcc version 4.0.2


У меня тоже есть вопрос:
Почему компилятор пропустил такую инициализацию b2?

Да при дальнейшем использовании b2 программа действительно не компилируется и выдает ошибку, именно так я понял что компилятор считает b2 прототипом функции
...
Рейтинг: 0 / 0
Где глюк?
    #34127586
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KИ в чем я тут отжог? Че-то до меня не доходитне понимаешь, почему несозданный объект нельзя никуда передавать? И ваще, да, бросай писать прогу: зачем, ведь её можно уже юзать, не написав ни строчки кода.
...
Рейтинг: 0 / 0
Где глюк?
    #34127590
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимирвременный объект, разумеется, создается по-любому
вот только skope различный

Ну например если писать
B<A> b2 = A(); или B<A> b2( static_cast<A>( A() ) );
то временных объектов будет меньше чем если писать
A a;
B<A> b1(a);
...
Рейтинг: 0 / 0
Где глюк?
    #34127598
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Sandro_KИ в чем я тут отжог? Че-то до меня не доходитне понимаешь, почему несозданный объект нельзя никуда передавать? И ваще, да, бросай писать прогу: зачем, ведь её можно уже юзать, не написав ни строчки кода.
Судя по этому посту в данном вопросе ты понимаешь меньше меня
...
Рейтинг: 0 / 0
Где глюк?
    #34127609
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
весёлый ты человек! Временных объектов меньше будет...
а если так?
B<A*> b2(new A());
...
Рейтинг: 0 / 0
Где глюк?
    #34127629
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoвесёлый ты человек! Временных объектов меньше будет...
а если так?
B<A*> b2(new A());
Не понимаю при чем тут данный пример
...
Рейтинг: 0 / 0
Где глюк?
    #34127644
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_K Голенков Владимирвременный объект, разумеется, создается по-любому
вот только skope различный

Ну например если писать
B<A> b2 = A(); или B<A> b2( static_cast<A>( A() ) );
то временных объектов будет меньше чем если писать
A a;
B<A> b1(a);

Если правильно создать конструкторы копирования и присваивания
то временных обьектов будет меньше,
а еще можно закрыть сразу кучу проблем
которые потом могут вылезти с деструкторами и памятью.
...
Рейтинг: 0 / 0
Где глюк?
    #34127645
то временных объектов будет меньше

imho, зависит от компилятора



VS2005:

b1 begin
constructor class A
constructor copy A
constructor copy A
constructor class B
b1 end
b2 begin
constructor class A
constructor copy A
constructor copy A
constructor class B
b2 end

g++ (GCC) 3.2.3 (mingw special 20030504-1):

b1 begin
constructor class A
constructor copy A
constructor copy A
constructor class B
b1 end
b2 begin
constructor class A
constructor copy A
constructor class B
b2 end
...
Рейтинг: 0 / 0
Где глюк?
    #34127652
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class A
{
public:
	 A(){std::cout << "constructor class A\n"; }
	 A(const A& a) {std::cout << "copy constructor class A\n";}
};

void function(A a)
 {
}

int main()
{
	A a;
	function(a);
        
        function(A())
}
Если не понимаешь о чем я то откомпиль эту прогу, и посмотри когда и сколько конструкторов копирования вызывается, и сколько временных объектов создается
...
Рейтинг: 0 / 0
Где глюк?
    #34127679
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир то временных объектов будет меньше

imho, зависит от компилятора



VS2005:

b1 begin
constructor class A
constructor copy A
constructor copy A
constructor class B
b1 end
b2 begin
constructor class A
constructor copy A
constructor copy A
constructor class B
b2 end

g++ (GCC) 3.2.3 (mingw special 20030504-1):

b1 begin
constructor class A
constructor copy A
constructor copy A
constructor class B
b1 end
b2 begin
constructor class A
constructor copy A
constructor class B
b2 end



А у меня вот так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	std::cout << "b1 begin\n";
	A a;
	B<A> b1(a);

	std::cout << "b1 end\n";
	
	std::cout << "b2 begin\n";
	B<A> b2(static_cast<A>(A()));
	std::cout << "b2 end\n";

	std::cout << "b3 begin\n";
	B<A> b3 = A();
	std::cout << "b3 end\n";
b1 begin
constructor class A
copy constructor class A
copy constructor class A
constructor class B
b1 end
b2 begin
constructor class A
copy constructor class A
constructor class B
b2 end
b3 begin
constructor class A
copy constructor class A
constructor class B
b3 end
...
Рейтинг: 0 / 0
Где глюк?
    #34127695
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Походу gcc оптимизирует вызовы конструкторов копирования круче чем MS VC
мож в vc надо оптимизацию включить?
...
Рейтинг: 0 / 0
Где глюк?
    #34127698
А у меня вот так

оптимизация...

чтобы было везде одинакого надо делать

B(const T &x);

а не

B(T x);
...
Рейтинг: 0 / 0
Где глюк?
    #34127728
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голенков Владимир А у меня вот так

оптимизация...

чтобы было везде одинакого надо делать

B(const T &x);

а не

B(T x);

Согласен.
...
Рейтинг: 0 / 0
Где глюк?
    #34127934
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_Kfunction(A());а что, это верный синтаксис? У меня конструктор вызывается, значит, объект создаётся. Если ты используешь объекты класса как reference-type, ты должен всё делать через указатели, если как value-type, объявляй copy construstor'ы и используй как value-type и без интенсивного вызова copy construstor'ов не обойтись - в этом суть value-type. Либо то, либо другое.
...
Рейтинг: 0 / 0
Где глюк?
    #34128086
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Sandro_Kfunction(A());а что, это верный синтаксис?
Да это совершенно верный синтаксис.

Он верный и если функчия объявлена так
void function(A a);
и если так
void function(const A& a)

причем если в функцию объект передается по значению, то компилятор(по крайней мере g++) соптимизирует вызов и не создаст временный объект а сконструирует объект сразу внутри функции.
...
Рейтинг: 0 / 0
Где глюк?
    #34128132
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Sandro_Kfunction(A());а что, это верный синтаксис?
Немного прогнал, при передачи по ссылке если внутри функции создается копия переданного объекта, то компилятор тоже соптимизирует вызов и конструктор копирования вызываться не будет.
...
Рейтинг: 0 / 0
Где глюк?
    #34129618
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В разделе 12.2 Temporary objects написано, что такая штука зависит от реализации - компилятор не обязан уменьшать количество временных объектов.
...
Рейтинг: 0 / 0
Где глюк?
    #34129625
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и продолжать интенсивно юзать конструкторы копирования
...
Рейтинг: 0 / 0
Где глюк?
    #34131814
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Временных объъек в данном случае всегда будет только один. И это независит от того, что там напишешь снаружи (если конечно специально объекты не плодить), это зависит от сигнатуры данной функции - она принимает параамет по значению, значит один раз объект скопируется.
...
Рейтинг: 0 / 0
Где глюк?
    #34132576
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВременных объъек в данном случае всегда будет только один.это на усмотрение компилятора.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где глюк?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]