【问题标题】:type required : Passing String as parameter to function需要类型:将字符串作为参数传递给函数
【发布时间】:2016-10-12 23:22:06
【问题描述】:

大家好

注意:我是 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 属性。

我尝试过的:

我尝试过使用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
       ^~~~~~~~~~~~

【问题讨论】:

  • 仔细阅读你的构造函数定义,你有一个错字。
  • 另外,_ReturnObject 是一个实现保留标识符,不要使用它。
  • @BaummitAugen 对不起,我不关注。您是否可能指的是我忘记将* 添加到const char* data 的可能性,如果是,那么我没有忘记,我刚才从给出的答案中了解到它的存在和意义(因此我仍然C++ 新手),如果不是,请帮助我阐明错误。谢谢
  • 是的,这就是我所说的。如果你是故意漏掉的,你的问题是什么?
  • @BaummitAugen 我找到了我的答案,感谢您的帮助,即使我的问题是-2,但一定有人会觉得这个问题很有帮助。再次感谢!

标签: c++ qt char qstring


【解决方案1】:

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

改为使用std::string,您必须先使用#include&lt;string&gt;。它是一种表现得更加友好的类类型:

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 的声明范围(即如果封闭类实例被销毁),实例就会被销毁。

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

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

【讨论】:

  • 我从哪里开始,谢谢你的解释。这对我帮助很大。在 C# 和 Java 中,我们被教导使用 new,但直到现在才真正理解它的含义。谢谢!
  • @KGCybeX C++ 不同,这里new 的含义大不相同。在 Java 中,一个对象在不再使用后会在某个时间点在后台被销毁(垃圾收集)。在 C++ 中,对象被确定性地销毁(当您离开其范围时)或者如果您明确要求它(“删除”)。这意味着您必须确保您尝试使用的对象实际上仍然存在。出于这个原因,例如引用的工作方式也大不相同。
  • @KGCybeX 我在回答中添加了一些信息,因为您使用的是 QT 库。
【解决方案2】:

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

【讨论】:

  • 所以 char(来自例如 java)是指单个字符,那么 char* 是什么意思呢?字符[] ?
  • char* 指的是内存部分,就像 c/c++ 中的每个指针一样。我假设你是在 java 之后才开始使用 c++ 工作的,所以我建议你应该学习 c++ 中的指针(因为它是两种语言之间最大的区别之一)。也许您还可以阅读有关智能指针的信息,它是在 c++11 中引入并提供更安全的内存管理
  • 抱歉,但我需要的远不止这些。 char 如何引用 '' 或单个字符,但 char* 引用 "" 或“字符串消息”?
  • 我之前编辑过我之前的评论,所以也许你已经得到了一种“抽象”的答案。基本上,“char”是指已经分配的 1 字节大小的变量,已经可以使用。 “char*”是指包含多个“char”元素的内存地址/部分。因此,“char”只能表示一个简单字符,而“char*”表示多个字符。正如您之前问过的,您可以将 char 数组 (char[]) 处理为“char*”,但这不是向后的,因此您不应该将 char* 处理为 char[],因为没有人可以保证它会(正确地)工作。
  • ""char*" 表示多个字符" 有点不对劲。更好的措辞是“char* 表示对内存中可能包含 0 个或多个 chars 的空间的引用,它不知道有多少。” @KGCybeX 您在 Java 中学到的许多东西都必须在 C++ 中忘记。它没有握住你的手,也不会在你身后捡起。当你告诉它去做时,它会做你告诉它去做的事情。它没有更多,也没有更少。当您超过内存分配的末尾时,Java 会抛出一些不错的小异常。如果幸运的话,C++ 会崩溃。如果您要求一些愚蠢的事情,它就会做到。
【解决方案3】:

此错误来自您作为参数提供的对象类型。 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_stringQString data_string。同样,const char getData(); 也应该在 header 和 implementation 中分别替换为 const char * getData();const QString getData();

【讨论】:

  • "一个char数组,即一个"char *"" 不正确。这是一个const char *。字符串文字可能驻留在可能不可写的内存中,因此是常量。您在问题的后面清楚地得到了这一点,但您知道... TL;DR .. 最好提前提出这种区别。
  • 谢谢,有了其他答案,我了解我的问题,通过您的解决方案,我找到了我想要的东西。谢谢,如果您有时间,这将提出我的问题,但是在应用建议的const char * data 解决方案后,我遇到了一个问题,寻找解决方案已被证明是徒劳的。如果您愿意提供帮助,您的意见将受到极大重视。我也知道这违反了 SO 政策,但是为此创建一个新问题似乎不合逻辑,因为我认为这是一个小错误
猜你喜欢
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2017-04-25
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多