powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где глюк?
25 сообщений из 33, страница 1 из 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
25 сообщений из 33, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где глюк?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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