Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 392 393 [394] 395 396 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5896
,
|
|
|
|
Ну так следуй ему и дальше. Возьми аналог С-массивов в С++(vector, array) и следуй на здоровье своему соглашению. Причем тут нормальные строки-то? Цитата Цитата D_KEY @ У него в буфере после trim будет лежать вот это: [KILLER\0<space><space>\0] Обычный std::string интерпретирует это как строку из 10 символов и никакого специального символа для него не существует. Например, он спокойно найдет пробел. Это если ему указать размер, тогда да найдет. Мы о внутреннем буфере говорим. Или когда ему возвращают буфер он должен его взять и посчитать длину, как от С-строки? |
|
Сообщ.
#5897
,
|
|
|
|
|
Сообщ.
#5898
,
|
|
|
|
Цитата D_KEY @ Мы о внутреннем буфере говорим. Или когда ему возвращают буфер он должен его взять и посчитать длину, как от С-строки? Если не передать размер? да, именно сейчас он так и работает. |
|
Сообщ.
#5899
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ Мы о внутреннем буфере говорим. Или когда ему возвращают буфер он должен его взять и посчитать длину, как от С-строки? Если не передать размер? да, именно сейчас он так и работает. Сейчас ты не возвращаешь ему внутренний буфер Т.е. ты предлагаешь специальный метод, который бы отдавал внутренний буфер строки в распоряжение пользователя, а потом строка могла бы его(буфер) обратно принять, рассматривая его содержимое или как С-строку, или просто как массив(если передаем длину)? |
|
Сообщ.
#5900
,
|
|
|
|
Цитата D_KEY @ Т.е. ты предлагаешь специальный(ые) метод(ы), который бы отдавал внутренний буфер строки в распоряжение пользователя, а потом строка могла бы обратно его обратно принять, рассматривая его содержимое или как С-строку, или просто как массив(если передаем длину)? Да, что то типо того. Цитата D_KEY @ Сейчас ты не возвращаешь ему внутренний буфер В каком смысле? |
|
Сообщ.
#5901
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ Т.е. ты предлагаешь специальный(ые) метод(ы), который бы отдавал внутренний буфер строки в распоряжение пользователя, а потом строка могла бы обратно его обратно принять, рассматривая его содержимое или как С-строку, или просто как массив(если передаем длину)? Да, что то типо того. Кода получится столько же, как и с буферным вектором. Все ради того, чтобы не копировать? Цитата Цитата D_KEY @ Сейчас ты не возвращаешь ему внутренний буфер В каком смысле? В таком, что assign от const char * принимает внешнюю С-строку и копирует ее содержимое до '\0' в свой буфер. А ты, как я понял, предлагаешь, чтобы std::string просто воспользовался переданным ему. |
|
Сообщ.
#5902
,
|
|
|
|
Цитата D_KEY @ В таком, что assign от const char * принимает внешнюю С-строку и копирует ее содержимое до '\0' в свой буфер. А ты, как я понял, предлагаешь, чтобы std::string просто воспользовался переданным ему. нет. assign как останется так и останется. Цитата D_KEY @ Кода получится столько же, как и с буферным вектором. Все ради того, чтобы не копировать? меньше копирований, проще работать. |
|
Сообщ.
#5903
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ В таком, что assign от const char * принимает внешнюю С-строку и копирует ее содержимое до '\0' в свой буфер. А ты, как я понял, предлагаешь, чтобы std::string просто воспользовался переданным ему. нет. assign как останется так и останется. А, то есть assign именно скопирует буфер? Тогда вообще не ясно какой профит по сравнению с вектором. У тебя будет разница, только если тебе нужно в C-API передать одну и ту же строку и на чтение и на запись. Что бывает крайне редко. |
|
Сообщ.
#5904
,
|
|
|
|
Цитата D_KEY @ А, то есть assign именно скопирует буфер? Тогда вообще не ясно какой профит по сравнению с вектором. У тебя будет разница, только если тебе нужно в C-API передать одну и ту же строку и на чтение и на запись. Что бывает крайне редко. Не совсем понял. Профит = -1 копирование, из строки в временный буфер, но это так, пока без особого мозгового штурма, если посидеть все нормально прикинуть, думаю еще лучше можно сделать. |
|
Сообщ.
#5905
,
|
|
|
|
никаких идей. мне в джаве не хватает(впрочем может я просто не знаю как это сделать) чего-то типа "локального переопределия метода" для класса, например, есть такой класс: ![]() ![]() public class A { public String show() { return "instance of class A"; } } и например, такие методы, работающие с объектами данного класса: ![]() ![]() public class Utils { public static A newA() { return new A(); } public static void show(A x) { System.out.println(x.show()); } } теперь я хочу написать какой-то метод с этими функциями и объектами класса A, но при этом хочу, чтобы в этом методе A.show() вел себя по-другому ![]() ![]() public class App { public static void main(String[] args) { Utils.show(Utils.newA()); // => "instance of class A" } } т.е. хочется чего-нибудь вроде ![]() ![]() public class App { local extend A { public String show() { return "my cool A object"; } } public static void main(String[] args) { Utils.show(Utils.newA()); // => "my cool A object" } } |
|
Сообщ.
#5906
,
|
|
|
|
korvin, а нельзя создать "локального" наследника и переопределить метод? Я просто плохо джаву знаю...
|
|
|
|
|
|
Кстати, а непрерывность буфера у строк по новому Стандарту случайно не даёт чёткого определённого поведения при const_cast<std::basic_string<TCHAR>::pointer>(str.c_str());
Добавлено В случае изначально неконстантного str, разумеется. |
|
Сообщ.
#5908
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ А, то есть assign именно скопирует буфер? Тогда вообще не ясно какой профит по сравнению с вектором. У тебя будет разница, только если тебе нужно в C-API передать одну и ту же строку и на чтение и на запись. Что бывает крайне редко. Не совсем понял. Профит = -1 копирование, из строки в временный буфер Так оно тебе нужно, только если строку используют и на чтение и на запись. На чтение(достаточно текущей реализации строки) ![]() ![]() some_read_fun(s.c_str()); На запись(достаточно текущей реализации строки) ![]() ![]() std::vector<char> buffer(sz); some_write_fun(&buffer[0], buffer.size()); str.assign(&buffer[0]); И вот чтение-запись: ![]() ![]() std::vector<char> buffer(str.begin(), str.end()); some_read_write_fun(&buffer[0], buffer.size()); str.assign(&buffer[0]); // С твоим буфером: size_t size = str.size(); const char *buffer = str.release(); some_read_write_function(buffer, size); str.assign(buffer); delete[] buffer; Да, тут на одно копирование меньше. Но это жесть какая-то, не находишь? |
|
Сообщ.
#5909
,
|
|
|
|
Цитата MyNameIsIgor @ korvin, а нельзя создать "локального" наследника и переопределить метод? Я просто плохо джаву знаю... а как ты "превратишь" объект предка в наследника? ![]() ![]() B b = (B) Utils.newA(); Utils.proc(b); не прокатит: ![]() ![]() Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B at App.main(App.java:25) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) покажи как бы ты на C++ сделал (там-то, я думаю, твой или подобный способ можно заюзать), может это наведет меня на мысль, как сделать в джаве =/ |
|
Сообщ.
#5910
,
|
|
|
|
Цитата MyNameIsIgor @ korvin, а нельзя создать "локального" наследника и переопределить метод? Я просто плохо джаву знаю... Можно. Там анонимные классы есть. Только проблему это не решит - объект создается в Utils, а не там, где ты хочешь сделать "локальный" метод. |