Вы можете попробовать этот код в своем основном классе. Это сработало для меня, но я использовал методы другим способом
try {
String receivedData = new AsyncTask().execute("http://yourdomain.com/yourscript.php").get();
}
catch (ExecutionException | InterruptedException ei) {
ei.printStackTrace();
}
Эти повышение присваивается, библиотека , кажется, точно, что Вы ищете. Это делает константы присвоения к контейнерам легче чем когда-либо.
#include <boost/foreach.hpp>
const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
cout << str << endl;
}
Вот пример:
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main() {
const char* const list[] = {"zip", "zam", "bam"};
const size_t len = sizeof(list) / sizeof(list[0]);
for (size_t i = 0; i < len; ++i)
std::cout << list[i] << "\n";
const std::vector<string> v(list, list + len);
std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n"));
}
Вместо того макроса, мог бы я предлагать этого:
template<typename T, int N>
inline size_t array_size(T(&)[N])
{
return N;
}
#define ARRAY_SIZE(X) (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)
1) Мы хотим использовать макрос для создания его временем компиляции постоянный; результатом вызова функции не является постоянное время компиляции.
2) Однако мы не хотим использовать макрос, потому что макрос мог случайно использоваться на указателе. Функция может только использоваться на массивах времени компиляции.
Так, мы используем определенный мыс функции для создания макроса "безопасным"; если функция существует (т.е. она имеет ненулевой размер), тогда, мы используем макрос как выше. Если функция не существует, мы возвращаем плохое значение.
Можно использовать begin
и end
функции из библиотеки диапазона Повышения для легкого нахождения концов примитивного массива, и в отличие от макро-решения, это даст ошибку компиляции вместо поврежденного поведения при случайном применении его к указателю.
const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));
Попробованный к upvote ответу H Craig, что необходимо использовать повышение:: присвойтесь, но у меня нет представителя: (
я встретился с подобной техникой в первой статье, которую я когда-либо читал Andrei Alexandrescu в Пользовательский Журнал C/C++, Vol 16, № 9, сентябрь 1998, стр 73-74 (имейте полную цитату, потому что это находится в комментариях моей реализации его кода, который я использовал с тех пор).
Шаблоны являются Вашим другом.
проблемы - никакой способ получить количество строк автоматически (что я знаю о).
существует стандартный трясиной способ сделать это, для которого много людей (включая MS) определяет макросы как arraysize
:
#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
Одна возможность состоит в том, чтобы использовать Нулевого указателя в качестве флагового значения:
const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
cout << *iList;
}
C++ 11 добавленных инициализаций перечисляет для разрешения следующего синтаксиса:
std::vector<std::string> v = {"Hello", "World"};
Поддержка этого C++ 11 опций были добавлены в [по крайней мере 111] GCC 4.4 и только в Visual Studio 2013 .
Можно кратко инициализировать vector<string>
от статически созданного char*
массив:
char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);
Это копирует все строки, между прочим, таким образом, Вы используете дважды память. Можно использовать предложение Will Dean для замены магического числа 3 здесь с arraysize (str_array) - хотя я не забываю там быть некоторым особым случаем, в котором та конкретная версия arraysize могла бы сделать Что-то Плохо (извините, я не могу сразу помнить детали). Но это очень часто работает правильно.
кроме того, если Вы действительно фанатичны об одной штуке строки, можно определить variadic макрос так, чтобы одна строка такой как DEFINE_STR_VEC(strvector, "hi", "there", "everyone");
работы.
можно использовать предложение [
#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
] Will Dean для замены магического числа 3 здесь с arraysize (str_array) - хотя я не забываю там быть некоторым особым случаем, в котором та конкретная версия arraysize могла бы сделать Что-то Плохо (извините, я не могу сразу помнить детали). Но это очень часто работает правильно.
случай, где это не работает, - когда "массив" является действительно просто указателем, не фактическим массивом. Кроме того, из-за пути массивы передаются функциям (преобразованный в указатель на первый элемент), это не работает через вызовы функции, даже если подпись похожа на массив — some_function(string parameter[])
действительно some_function(string *parameter)
.
Корректный путь состоит в том, чтобы объявить массив обозначенного типа. Ниже пример для ссылки.
std::vector<std::string> v = {"Array", "String"};
#include <iostream>
#include <string>
#include <vector>
#include <boost/assign/list_of.hpp>
int main()
{
const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" );
std::copy(
v.begin(),
v.end(),
std::ostream_iterator< std::string >( std::cout, "\n" ) );
}