2015-01-20 7 views
0

QT 5.2 QLineEdit의 데이터에 대한 QString 포인터를 얻으려면 어떻게해야합니까? 예를 들어QString을 참조하십시오.

은 함수가 존재하는 QString에 대한 포인터를 받아 그 그래서

void SomeClass::do_something(QString *qptr) { 

    qWarning() << "string is " << qptr; 
} 

, 나는 QLineEdit 인 목적을 가지고 내가하지 않다 (목적을 읽기 위해 해당 텍스트에 대한 포인터를 원하는)를 수정하는 것 :

fld_title=new QLineEdit(); 
/// open a window and work with fld_title so title is set 
/// 
some_obj->do_something(fld_title->text()); <<-- produces compile error 

내가 선언 do_something() 함수를 내가 인수 함수에 전체 개체를 전달할 수 컴파일러를 원하지 않기 때문에 포인터가 아닌 객체 자체를받을 수, 그것은 것입니다 천천히.

답변

2

text()은 포인터가 아니기 때문에 QString 값을 반환하므로 함수에 직접 전달할 수 없습니다.

가장 좋은 방법은 값을 취하도록 QString 또는 참조 const QString &으로 기능을 변경하는 것입니다. 인수가 상수가되도록하려면 const이 참조 매개 변수에 필요합니다.

컴파일러에서 전체 개체를 인수의 함수에 전달하지 않으려면 속도가 느립니다.

elision 및 move semantics (Qt가 지원하는 경우)를 복사하면 속도가 느려지지 않을 수 있습니다. 그러나 속도에 대해 염려하고 값으로 전달하는 것이 병목 현상이라는 것을 알게되면 참조로 전달하는 것은 포인터를 전달하는 것과 똑같은 속도 여야합니다.

0

QLineEdit.text()QString *이 아닌 QString을 반환합니다. QString 또는 const QString & 코드를 변경해야합니다.) (

void SomeClass::do_something(const QString& str) { 
    qWarning() << "string is " << str; 
} 

을 그리고 단지 QLineEdit : 텍스트를 사용

+0

@ Mike Seymour 잘못된 코드를 제거하고 기능을 변경해야한다고 제안했습니다. – NathanOliver

+0

또한 임시 인수를 허용하려면'const QString &'이어야합니다. –

0

내가 추천 할 것입니다.

편집 : 다른 답변이 변경되었습니다. :)

0

QT 5.2 QLineEdit의 데이터에 대한 QString 포인터를 얻으려면 어떻게해야합니까?

기본적으로 할 수 없습니다. API는 QString 객체의 사본만을 제공합니다.

하지만 QString은 copy on write 원칙을 사용하므로 복사하기가 저렴합니다. QString 복사본을 변경하지 않을 때까지 원하는만큼 많은 복사본을 가질 수 있다는 것을 의미합니다. 그것들은 얕은 사본이 될 것입니다.

전달 객체는

0

는 일반적으로 QObjects 또는 잘 desinged 클래스는 당신이를 통해 액세스 권한을 부여되지 않습니다 (메모리 dealocation에 대한 책임이 항상 정의해야 포인터의 경우) 코드의 가독성과 maintanability 등의 긍정적 인 측면을 가지고 회원들에 대한 포인터. 그것은 클래스 캡슐화를 죽이고 나쁜 디자인으로 간주됩니다. 이 경우에는 QLineEdit :: text()와 같이 사본을 얻을 수 있으며 사본을 사용하여 작업 할 수 있습니다. arround 원시 포인터를 전달할 때의 문제는 포인터 뒤에있는 메모리를 소유하고있는 객체를 정확히 모르고 삭제해야한다는 것입니다. 실제로 arround 동적으로 할당 된 객체 (및 소유권)를 전달해야하는 경우 스마트 포인터를 QSharedPointer 등으로 사용합니다. 소유권이 다른 객체에 전달되지 않아 해당 객체를 함수 호출에만 필요로하면 객체에 대한 참조를 선호하거나 정말로 느슨한 결합으로 객체를 참조하고 두 객체를 Qt 신호/슬롯과 연결합니다. 이 경우 통신하는 두 객체는 ​​다른 객체에 대한 포인터/참조가 필요하지 않습니다 ...

관련 문제