2016-10-12 1 views
-1

Доброго дня всетипа требуется: Передача строки в качестве параметра функционировать

примечание: Я новичок в C++, обучая себя, как я иду вперед, и извинение, если это дубликат, но я не нашел пример/ответ/учебник, чтобы ответить на вопрос, возможно, я еще не понимаю его.

У меня есть функция с заголовком и реализации определенной ниже:

Заголовок

#ifndef RETURNOBJECT_H 
#define RETURNOBJECT_H 

#include <QtCore> 
#include "enums.h" 

class ReturnObject 
{ 
public: 
    ReturnObject(); 
    ReturnObject(ReturnCode enum_code, const char data); 

    const char getData(); 
    ReturnCode getCode(); 

private: 
    ReturnCode e_code; 
    const char data_string; 

}; 

#endif // RETURNOBJECT_H 

Реализация

#include "returnobject.h" 

ReturnObject::ReturnObject(){ 
    data_string="WARN"; 
} 

ReturnObject::ReturnObject(ReturnCode enum_code, const char data) 
    : e_code(enum_code) 
    , data_string(data) 
{} 

ResultCode ReturnCode::getCode() 
{ 
    return e_code; 
} 

const char ReturnObject::getData() 
{ 
    return data_string; 
} 

Пожалуйста, обратите внимание, я не знаком с указатели и т. д., как я но я честно понимаю каждую концепцию.

Цель:

Этот объект создается с помощью функции пользовательского класса, хранятся в классе и вернулся в родительский класс. Объект содержит настраиваемое возвращаемое значение exec() и возможное выходное сообщение/данные из класса (я создал это из-за ограниченных ограничений, например, QDialog.setResult(), позволяя получить результат только от exec() от 1 или 0).

Вопрос/проблема/вопрос

вызова класса с:

Private 
    ReturnObject _ReturnObject; 

_ReturnObject = new ReturnObject(ReturnCode::LoginDialog_EmptyLoginPass, ""); 

обеспечивает следующее сообщение об ошибке:

/home/cx/qt-projects/project-i/loginstatusdialog.cpp:21: error: invalid conversion from 'const char*' to 'char' [-fpermissive] 
     _ReturnObject = new ReturnObject(ReturnCode::LoginDialog_EmptyLoginPass, ""); 
                        ^

Таким образом, я делаю вывод из ошибки, что второй параметр ->"" или data - проблема, поскольку я, скорее всего, неправильно прекратите этот тип данных в конструкторе.

Как определить это в конструкторе?, скорее какой тип данных "" использование? Насколько я понимаю, это действительно свойство const.

То, что я пробовал:

Я попытался с помощью char, const char, QString оба, которые дают подобную ошибку.

Любые предложения?

выход Компилятор

после того, как раствор const char * data

../project-i/loginstatusdialog.cpp: In constructor 'LoginStatusDialog::LoginStatusDialog(QString, QString, QString*, QWidget*)': 
../project-i/loginstatusdialog.cpp:21:44: error: use of deleted function 'ReturnObject& ReturnObject::operator=(ReturnObject&&)' 
     _Return_Object = ReturnObject(1, ""); 
              ^
In file included from ../project-i/loginstatusdialog.h:10:0, 
       from ../project-i/loginstatusdialog.cpp:1: 
../project-i/returnobject.h:7:7: note: 'ReturnObject& ReturnObject::operator=(ReturnObject&&)' is implicitly deleted because the default definition would be ill-formed: 
class ReturnObject 
     ^~~~~~~~~~~~ 
+1

Пересмотрите определение конструкторов тщательно, у вас есть опечатка. –

+2

Кроме того, '_ReturnObject' является зарезервированным идентификатором реализации, не используйте его. –

+0

@BaummitAugen Извините, я не понимаю. Возможно, вы ссылаетесь на возможность, которую я забыл добавить '*' в 'const char * data', если да, то я не забыл, что мне стало известно о его существовании и значении момента назад из ответа (отсюда Я все еще новичок в C++), если нет, то, пожалуйста, помогите мне в том, чтобы пролить свет на ошибку. Спасибо – KGCybeX

ответ

2

Вы говорите, что вы еще не знакомы с указателями, поэтому я советую вам не использовать char* для строк (это C-стиль для этого), потому что он в значительной степени основан на концепции указателей.

Вместо этого используйте std::string, для которого у вас есть #include<string>. Это тип класса, который ведет себя гораздо более дружелюбно:

std::string data_string; 

ReturnObject::ReturnObject(ReturnCode enum_code, std::string data) 

std::string ReturnObject::getData() 

и ваш код будет скомпилирован.

const char всего лишь один один символ и постоянный (тоже нельзя). Вероятно, это не то, что вы хотели.

Также нет причин для использования динамического распределения (new), но если вы не знакомы с указателями. Вместо того, чтобы просто бросить его, чтобы получить статическое распределение:

_ReturnObject = ReturnObject(ReturnCode::LoginDialog_EmptyLoginPass, ""); 

new означает, что вы хотите, чтобы созданный экземпляр, чтобы остаться в живых, пока вы не вызовете delete на указатель на него, который может быть в любом месте программы.

Без new экземпляр будет уничтожен, как только область объявления _ReturnObject оставлена ​​(т. Е. Если экземпляр закрывающего класса уничтожен).

В вашем случае строка вызовет новую ошибку, так как new возвращает не сам объект, а указатель на него, и вы пытаетесь назначить этот указатель на не указатель (_ReturnObject).

Также, поскольку вы используете библиотеку Qt, с которой я не очень хорошо знаком, может быть лучше использовать ее реализацию строк QString. От взгляда на документацию мне кажется, что вы можете использовать его непосредственно на месте std::string. std::string однако является стандартным типом библиотеки, который всегда доступен с каждым компилятором и платформой C++.

+0

С чего начать, спасибо за объяснение. Это очень помогло мне. В C# и Java нас научили использовать «новые», но никогда не понимали, что это значит до сих пор. Спасибо! – KGCybeX

+1

@KGCybeX C++ отличается, значение 'new' здесь совсем другое. В Java объект разрушается в фоновом режиме в какой-то момент после того, как он больше не используется (сбор мусора). В объекте C++ детерминированно уничтожается (когда вы покидаете область действия) или если вы явно запрашиваете его («удалить»). Это означает, что вы должны убедиться, что объекты, которые вы пытаетесь использовать, по-прежнему существуют. С другой стороны, ссылки по этой причине работают по-разному. – user4407569

+1

@KGCybeX Я добавил некоторую информацию в свой ответ, так как вы используете библиотеку QT. – user4407569

0

Вы можете загрузить простой символ в символьного типа (например, 'а'). Если вам нужна строка, вы должны использовать char * или std :: string. , например. char * data_string = "WARN";

+0

, поэтому char (например, java) относится к одному символу, то что означает символ char *? char []? – KGCybeX

+1

char * относится к части памяти, как это делает каждый указатель в c/C++. Я предполагаю, что вы только что начали работать на C++ после java, поэтому я могу порекомендовать вам узнать о указателях в C++ (поскольку это одно из самых больших различий между двумя языками). И, возможно, вы могли бы также прочитать о умных указателях, которые были введены в C++ 11, и обеспечивает более безопасное управление памятью – mhajnal

+0

, но мне нужно немного больше. Как 'char' ссылается на' ''' или на один символ, но 'char *' ссылается на '' '' или' строковое сообщение '? – KGCybeX

0

Эта ошибка исходит от типа объекта, который вы указываете в качестве аргумента. Второй параметр конструктора ReturnObject является символом char, но вы даете "", который представляет собой пустую строку (массив char, а именно «char *»).

Если вы пишете '' вместо "", ваша программа будет компилироваться как '' Используется для обозначения пустого символа. Но я не уверен, что это то, что вам нужно реализовать ...

Если вы хотите второй аргумент ReturnObject конструктор должен быть строкой, то вы должны заменить прототип

ReturnObject(ReturnCode enum_code, const char data); 

по

ReturnObject(ReturnCode enum_code, const char * data); 

или лучше

ReturnObject(ReturnCode enum_code, const QString data); 

Если вы сделаете это, не забудьте с введите const char data_string на const char * data_string или QString data_string в заголовке по вашему выбору.Точно так же const char getData(); также должен быть заменен в заголовке и реализации на const char * getData(); или const QString getData(); соответственно.

+0

"массив символов, а именно" char * "" Неверный. Это 'const char *'. Строковые литералы могут находиться в памяти, которая может быть недоступна для записи, поэтому она постоянна. Вы ясно получите это позже в вопросе, но вы знаете ... TL; DR ..лучше всего выделить это различие. – user4581301

+0

спасибо, с другими ответами Я понимаю свою проблему, с вашим решением я нашел то, что искал. Спасибо, если у вас есть момент, и это вызовет мой вопрос, но после применения предлагаемого решения 'const char * data', я столкнулся с проблемой, поиск решения оказался бесплодным. Вы бы очень ценили мнение, если вы хотите помочь. Также я знаю, что это противоречит политике SO, но создание нового вопроса для этого кажется нелогичным, поскольку я полагаю, что это небольшая ошибка – KGCybeX

Смежные вопросы