Рассмотрите следующее:
class CMyClass
{
public:
CMyClass()
{
printf( "Constructor\n" );
}
CMyClass( const CMyClass& )
{
printf( "Copy constructor\n" );
}
};
int main()
{
std::list<CMyClass> listMyClass;
listMyClass.resize( 1 );
return 0;
}
Это производит следующий вывод:
Конструктор
Конструктор копии
Теперь мой вопрос: Как я избегаю конструктора копии? Или помещать его в другом отношении: Как я могу создать объекты в контейнере STL без ненужной операции копии. Там некоторый путь состоит в том, чтобы сделать "оперативную" конструкцию с помощью конструктора по умолчанию?
Обновление - отвечает до сих пор:
Интеллектуальные указатели являются излишеством для моего приложения. Но я действительно задаюсь вопросом, почему это не может быть сделано. Это походит на такую очевидную вещь хотеть сделать. Какие-либо другие идеи? Я даже приму противный взлом, если он будет работать...
Решение
Я думаю, что просто нашел решение для своей проблемы из всех комментариев и ответов изложенным здесь. Решение состоит в том, чтобы создать пустой объект и иметь в наличии его для единственной цели использовать его позже для того, чтобы сделать чистые копии. Тогда можно использовать один из методов, которые берут ссылку (как push_back, или вставьте). Это все еще называет конструктора копии для каждого нового объекта введенным, но по крайней мере это не оба конструктор конструктора по умолчанию И копии:
int main()
{
CMyClass Empty;
std::list<CMyClass> listMyClass;
for ( int c=0; c<10; ++c )
{
listMyClass.push_back( Empty );
}
return 0;
}
Для данного конкретного случая «Просто»
. В общем
let Just k = x in f k + 2 == 4
Этот трюк работает с любым конструктором типа данных и часто используется с (:)
для непустых списков.
Я не уверен, что это проблема. Отправка электронной почты - это не очень дорогая операция - она просто сообщает SMTP-серверу, что почта должна быть отправлена, и SMTP-сервер заботится оттуда.
Тем не менее, вы можете попробовать:
new Thread(new Runnable() {
public void run() {
MailUtility.send(inviteeUser.getUserEmailAddress().trim(),
"vagarwal@q3tech.com", "add friend message", Utility
.getAddFriendMessageBody(LoginHelper
.getLoggedInUserEmail()), false);
}
}).start();
-121--3229703- Все контейнеры стандартной библиотеки C++ хранят копии. Поэтому нельзя избежать вызова конструктора копирования, если требуется сохранить значения в контейнере - единственным выходом является сохранение указателей. Если требуется уменьшить накладные расходы на копирование, изучите использование ссылочного подсчета.
Использование указателей
std::list<CMyClass*> listMyClass;
Извините, в настоящее время не со СТД :: Список и аналогичные контейнеры. (Но вы можете написать свой собственный чуть-разный контейнер, если вам действительно нужно это, и все еще следуйте за остальной частью интерфейса STL.)
Вам не нужно использовать CTO по умолчанию, однако:
std::list<CMyClass> listMyClass;
listMyClass.resize(1, obj_to_copy_from);
, например:
std::list<CMyClass> listMyClass;
listMyClass.resize(1, CMyClass(use, specific, ctor));
Размеры выглядят следующим образом:
void list<T>::resize(size_type new_size, T copy_from = T());
, который создает новый объект (используя CTOR по умолчанию) по умолчанию.
Несмотря на отсутствие переносимого # define или чего-то, на что можно положиться, платформы обеспечивают стандартные функции для преобразования в «host» endian и от него.
Как правило, вы выполняете место хранения - на диск, или сеть - используя «network endian», который является BIG endian, и локальные вычисления с использованием host endian (который на x86 является LITTLE endian). Для преобразования между ними используются htons ()
и ntohs ()
и друзья.
Попробуйте:
#include<stdio.h>
int x=1;
#define TEST (*(char*)&(x)==1)?printf("little endian"):printf("Big endian")
int main()
{
TEST;
}
-121--730635- используйте указатель или смарт-указатель (boost::shared_ptr, а не auto_ptr)