LINUX.ORG.RU

Передача объектов QT по ссылке


0

1

Допустим есть функция f(QString &str){};

и два вариантов вызова:

[code=cpp]
QString str(«Any string»);
f(str);
[/code]

[code=cpp]
f(QString(«Any string»));
[/code]

по какой причине второй вариант не компилится? ошибка «no matching function for call to f(QString)»

пока нашел один способ без объявления переменной:
f(QString *str){};
и вызывать f(&QString(«Any string»));
но тогда вываливается ворнинг «taking address of temporary»


Он же говорит, что ты передаешь ссылку на временный объект. Который, вроде как, существует только в строке с вызовом конструтора.

Если хочешь передавать такие объекты, то, скорее всего, они у тебя там не меняются. Поэтому в качестве параметра напиши не просто f(QString &str), а f(const QString &str) - такое в Qt сплошь и рядом встречается.

VoofT
()
Ответ на: комментарий от VoofT

еще раз перечитай, когда такое сообщение появляется(передача по указателю с конструированием при вызове функции)

cva
() автор топика

тут дело не в Qt а в голове. почитай С++ работа с указателями.

MikeDM ★★★★★
()
Ответ на: комментарий от cva

> еще раз перечитай, когда такое сообщение появляется
Был дан ответ на вопрос. В посте вижу только один вопросительный знак.

передача по указателю с конструированием при вызове функции

Тебе и сказал компилятор: зачем берешь адрес у временного объекта?

VoofT
()
Ответ на: комментарий от cva

а за const спасибо, «const QString &str» позволяет передавать объекты по ссылке, конструируемые при вызове функции :)

cva
() автор топика

Я думаю что конструкцию foo(T& a) { ... } нужно вообще запретить. Если нужно передать out-параметр - нужно использовать передачу по указателю, если параметр не изменяется - можно использовать const T& a.

anonymous
()

Господи. Ну и бред.

Где, какой указатель? При чем тут это?

Все временые объекты - const. все просто

namezys ★★★★
()
Ответ на: комментарий от namezys

про все временные объекты мысль конечно интересная... но!

[code=cpp]
class T
{
   int i;
public:
   void foo(T& obj)
   {
      obj.i = 0;
   };

   void test()
   {
      T testobj;
      testobj.foo(T());
   }
};
[/code]

в VisualStudio компилится без ошибок и предупреждений.
Заметьте, передается ссылка на НЕКОНСТАНТНЫЙ объект, который затем вполне успешно меняется. объекты создаются на стеке, и никто не запрещает их менять(если они не помечены как const) или получать на них указатели

cva
() автор топика
Ответ на: комментарий от Cy6erBr4in

вы так говорите, как будто это запрещено стандартом, а VS это самовольно реализовывает.

cva
() автор топика
Ответ на: комментарий от cva

ну про стандарт тебе другие расскажут, я не фанат C++.. но ничего хорошего, кроме как дополнительной возможности выстрелить себе в ногу, я не вижу...

Cy6erBr4in ★★★
()
Ответ на: комментарий от cva

>в VisualStudio компилится без ошибок и предупреждений.

Ну давайте еще тут обсудим особый, уличный С++ студии.

Pavval ★★★★★
()
Ответ на: комментарий от Cy6erBr4in

эта возможность делает код более удобочитаемым и более коротким.

допустим в библиотеке ObjectARX (для AutoCAD) построить плоскость gj трем точкасм можно вот так:

AcGePoint point1(0,0,0), point2(1,1,1), point3(2,2,2);
AcGePlane plane(point1,point2,point3);

а можно так: AcGePlane(AcGePoint(0,0,0), AcGePoint(1,1,1), AcGePoint(2,2,2))

я лично предпочитаю второй вариант, не вижу смысла объявлять переменные, служащие лишь для передачи в функцию, и удлинять код.

cva
() автор топика
Ответ на: комментарий от anonymous

Хорошо, что анонимусов слушать в стандарте никто не будет.

Deleted
()
Ответ на: комментарий от cva

Ну дык, если ф-ция будет AcGePlane(const AcGePoint&, const AcGePoint&, const AcGePoint&) то все будет отлично.

У студии свой C++ c Блекдж^W Сильверлайтом и .NET'ом

Kosyak ★★★★
()

По причине того, что C++ это сраное дерьмо.

Love5an
()
Ответ на: комментарий от anonymous

Вот что из плюсов и надо убрать к херам, так это ссылки. И константные(все равно не работают, кстати, так какая разница), и нет.
Совершенно убогая и невыносимо кривая, в контексте C++, концепция, ничего полезного не добавляющая.

Love5an
()
Ответ на: комментарий от Cy6erBr4in

хотелось бы внятных комментариев что не так со всторым вариантом

cva
() автор топика
Ответ на: комментарий от Pavval

Мне недавно препод по ООП сказал, что gcc в топку, потому что он игнорирует массивы нулевой длины в структуре, даже если они в начале, а msvc компилирует без ошибок, только если они в конце...

Yareg ★★★
()
Ответ на: комментарий от cva

>в VisualStudio компилится без ошибок и предупреждений
ппц.
В Линукс встроеная защита памяти.. все просто, а винде пофиг на то что ты выходишь на неопределенную память

pozitiffcat ★★★
()
Ответ на: комментарий от cva

Оппа. У нас как раз некомпилился и ругался. что-то странное

namezys ★★★★
()
Ответ на: комментарий от Love5an

> Совершенно убогая и невыносимо кривая, в контексте C++, концепция, ничего полезного не добавляющая.

Как минимум скорость. Зато еще и возможность стрелять под себя из гранотомета

namezys ★★★★
()
Ответ на: комментарий от Love5an

> Уроки сделал?

Вау. Первый номральный комент

namezys ★★★★
()

>f(QString(«Any string»));
а нахрена тебе ссылку передавать вообще? Если ты используешь константное значение, ты че.. результат хочешь записать в QString(«Any string») lol

pozitiffcat ★★★
()
Ответ на: комментарий от pozitiffcat

а теперь развернутее, чтоб попинать могли

в винде так же бросается системное исключение (SEH вроде) при обращении к невыделенной памяти, так же есть защита от переполнения стека и тд

namezys ★★★★
()
Ответ на: комментарий от Love5an

> открой для себя указатели

семантика указателя - полиморфный объект.

семантика объекта - значение.

кроме того, удобство использования

namezys ★★★★
()
Ответ на: комментарий от pozitiffcat

> Да блин, писал код в котором нарошно лез в неразмеченную память, винде пофиг, а линь выдает segmentation fault

А точнее? Может память попадала в выделенные страницы?

namezys ★★★★
()
Ответ на: комментарий от pozitiffcat

> а че... указатель это не ссылка на объект хочешь сказать?

вообще-то нет. как это реализовано, программиста С++ не касается в 99.999% случаев

namezys ★★★★
()
Ответ на: комментарий от pozitiffcat

&var это тоже самое что *var тока в первом передается адрес объекта, а второе это и есть адрес объекта и вообще, точки зрения каждого программиста никогда не сойдуться так что не парьтесь по этому поводу ;-)

pozitiffcat ★★★
()
Ответ на: комментарий от namezys

да какая нахрен каша, главное работает :-D а книжки мануалить как же там когдато хрен знает скока лет назад было это реализовано, НАФИГА ЭТО.. ты историю России знаешь? нет скажешь зачем.. вот и тут также

pozitiffcat ★★★
()
Ответ на: комментарий от pozitiffcat

С++ высокоурожайный язык. Надо пользоваться данным им инструментов.

Объекты, к которым обращаются по точка - объекты-значение. Объекты, к которым обращаются по -> это полиморфные. Вот так.

namezys ★★★★
()
Ответ на: комментарий от pozitiffcat
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

#define PAGE_SIZE 4096

int main(void)
{
    char *p = VirtualAlloc(NULL,
                           PAGE_SIZE,
                           MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN,
                           PAGE_READWRITE);
    printf("This should not be displayed: %08X",
           *(p+PAGE_SIZE));
    return 0;
}

Чо, неужто и так ниче не происходит?

Love5an
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.