所需类型:将字符串作为参数传递给函数

type required : Passing String as parameter to function

大家好

注意:我是 c++ 的初学者,边学边自学,如果这是重复的,也很抱歉,但我还没有找到 example/answer/tutorial 来回答问题,可能就是没看懂

我有一个 header 的函数,其实现定义如下:

Header

#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;
}

请注意,我不太熟悉指针等,但我对每个概念都有一定的了解。

用途:

此 object 由自定义 class 函数创建,存储在 class 中并 returned 到 parent class . object 包含一个自定义的 exec() return 值和 class 的可能输出 message/data (我创建了这个,因为对例如 QDialog.setResult() 只允许 exec() return 结果为 1 或 0).

Issue/Problem/Question

使用以下方式调用 class:

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 属性.

我试过的:

我尝试使用 charconst charQString 两者都给出了类似的错误。

有什么建议吗?

编译器输出

解决后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
       ^~~~~~~~~~~~

您可以将一个简单的字符加载到 char 类型中(例如 'a')。如果你想要一个字符串,你必须使用 char* 或 std::string。 例如 字符* data_string = "WARN";

你说你还不熟悉指针,所以我建议你不要对字符串使用 char* (这是 C 风格的做法),因为它很大程度上基于概念指针。

请改为使用 std::string,为此您必须先 #include<string>。它是一种 class 类型,表现得更加友好:

std::string data_string;

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

std::string ReturnObject::getData()

您的代码将编译。

const char 只是 one 单个字符,也是一个常量(不可变)。这可能不是你想要的。

如果您不熟悉指针,您也没有理由使用动态分配 (new)。而只是放下它以获得静态分配:

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

new 表示您希望创建的实例保持活动状态,直到您在指向它的指针上调用 delete,该指针可以在程序中的任何位置。

如果没有 new,实例将在 _ReturnObject 的声明范围离开时立即被销毁(即,如果封闭的 class 实例被销毁)。

在你的情况下,该行无论如何都会触发一个新错误,因为 new returns 不是对象本身而是指向它的指针,而你正试图将该指针分配给非指针( _ReturnObject).

另外由于你使用的是Qt库,我不是很熟悉,使用它的字符串实现可能会更好QString。通过查看文档,在我看来您应该能够直接使用它来代替 std::stringstd::string 但是,标准库类型始终适用于每个 C++ 编译器和平台。

此错误来自您作为参数提供的 object 类型。 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);

如果您这样做,请不要忘记根据您的选择在 header 中将 const char data_string 的类型更改为 const char * data_stringQString data_string。同样,const char getData(); 也应该在 header 和实现中分别替换为 const char * getData();const QString getData();