将空字符串传递给构造函数 注:我对C++仍然是新的,虽然这可能是一个简单的问题,但我无法找到解决方案。

将空字符串传递给构造函数 注:我对C++仍然是新的,虽然这可能是一个简单的问题,但我无法找到解决方案。,c++,qt,c++11,char,qstring,C++,Qt,C++11,Char,Qstring,目的: 我想向我的构造函数传递一个空字符串(就像在java/C中一样)。我收到一个错误: error: no matching function for call to 'ReturnObject::ReturnObject(ResultCode::ClientCode, const char [1])' return new ReturnObject(ResultCode::ClientCode::enum_FailedOpeningClientSocket, ""); R

目的:

我想向我的构造函数传递一个空字符串(就像在java/C中一样)。我收到一个错误:

error: no matching function for call to 'ReturnObject::ReturnObject(ResultCode::ClientCode, const char [1])'
         return new ReturnObject(ResultCode::ClientCode::enum_FailedOpeningClientSocket, "");
ReturnObject
的目的是封装
enum
字符串

此错误是什么意思?我如何解决它?

我尝试将构造函数参数从
QString data
更改为
char data
,并使用
'
调用,但这导致了一个错误
空字符常量

呼叫代码:

return new ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "");
class ReturnObject
{
public:
    ReturnObject(ResultCode enum_code, QString data);

    QString getData();
    ResultCode getCode();

private:
    ResultCode e_code;
    QString data_string;

};
标题:

return new ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "");
class ReturnObject
{
public:
    ReturnObject(ResultCode enum_code, QString data);

    QString getData();
    ResultCode getCode();

private:
    ResultCode e_code;
    QString data_string;

};
实施

#include "returnobject.h"

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

ReturnObject::ReturnObject(ResultCode enum_code, QString data)
    : e_code(enum_code)
    , data_string(data)
{}

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

QString ReturnObject::getData()
{
    return data_string;
}
多亏了WastThisHelp和一些注释,我犯了一个悲惨的逻辑错误,导致我查看了错误的参数,解决方案是我应该将我的enum类
ResultCode
这是一个嵌套的
类的父类,在本例中是
ClientCode
,如下所示,从我的枚举类头

enum.h

#ifndef ENUMS_H
#define ENUMS_H

class ResultCode{
public:
    enum class LoginDialogCode{
        enum_LoginSuccess=0,
        enum_InternetOffline=1,
        enum_ServerOffline=2,
        enum_InvalidLoginPass=3,
        enum_EmptyLoginPass=4,
        enum_FailedRetreivingServerList=5,
        enum_TokenFailed=6
    };

    enum class ClientCode{
        enum_SentSuccess=10,
        enum_FailedOpeningClientSocket=11,
        enum_FailedClientSocketConnection=12,
        enum_FailedWritingtoClientSocket=13,
        enum_FailedReadingfromClientSocket=14
    };

    enum class ServerCode{
        enum_ReceivedSuccess=20,
        enum_FailedOpeningListenSocket=21,
        enum_FailedBindingtoListenSocket=22,
        enum_FailedAcceptingListenSocket=23,
        enum_FailedWritingtoListenSocket=24,
        enum_FailedReadingfromListenSocket=25
    };
};

#endif // ENUMS_H

您的错误不在第二个参数上,而是在第一个参数上。根据你的问题,我猜你有这样的代码:

struct ReturnCode
{
    enum class ClientCode
    {
        enum_FailedSocketConnection,
        // other values
    };
};
class ReturnObject
{
public:
    ReturnObject(ResultCode::ClientCode enum_code, QString data);

    QString getData();
    ResultCode::ClientCode getCode();

private:
    ResultCode::ClientCode e_code;
    QString data_string;

};
因此,您得到了两种声明类型:
ReturnCode
ReturnCode::ClientCode
。查看您的构造函数声明:

`ReturnObject::ReturnObject(ResultCode enum_code, QString data)`
它需要一个类型为
ReturnCode
的对象作为第一个参数,同时查看您的调用:

ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "")
将类型为
ReturnCode::ClientCode
的对象作为第一个参数传递

您可以这样更改代码:

struct ReturnCode
{
    enum class ClientCode
    {
        enum_FailedSocketConnection,
        // other values
    };
};
class ReturnObject
{
public:
    ReturnObject(ResultCode::ClientCode enum_code, QString data);

    QString getData();
    ResultCode::ClientCode getCode();

private:
    ResultCode::ClientCode e_code;
    QString data_string;

};
一旦你到了这里。您可以考虑将枚举排除在 ReultCu码< /C> >:

enum class ClientCode
{
    enum_FailedSocketConnection,
    // other values
};

class ReturnObject
{
public:
    ReturnObject(ClientCode enum_code, QString data);

    QString getData();
    ClientCode getCode();

private:
    ClientCode e_code;
    QString data_string;

};
这遵循了“扁平比嵌套好”。这在C++中也是正确的。 编辑:

return new ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "");
class ReturnObject
{
public:
    ReturnObject(ResultCode enum_code, QString data);

    QString getData();
    ResultCode getCode();

private:
    ResultCode e_code;
    QString data_string;

};
从您的评论来看,我们在这里讨论一个问题,您的代码需要重新设计。这是第一个命题:

#include <type_traits>

enum class ClientCode{
    // ...
    enum_FailedClientSocketConnection=12,
    // ...
};

template<typename T>
struct ReturnObject
{
    static_assert(std::is_enum<T>::value, "T should be an enum");

    const T e_code;
    const QString data_string;
};

template<typename T>
ReturnObject<T> make_return_object(T e_code, std::string data_string)
{
    return ReturnObject<T>{e_code, data_string};
}

// usage

return make_return_object(
    ClientCode::enum_FailedClientSocketConnection, ""
);
#包括
枚举类ClientCode{
// ...
enum_FailedClientSocketConnection=12,
// ...
};
模板
结构返回对象
{
静态_断言(std::is_enum::value,“T应该是一个enum”);
常量代码;
常量QString数据字符串;
};
模板
ReturnObject生成\返回\对象(TEU代码,std::字符串数据\字符串)
{
返回返回对象{e_代码,数据_字符串};
}
//用法
返回使返回对象(
ClientCode::enum_FailedClientSocketConnection“”“
);
我删除了public const成员的访问器
getData
getCode
:它们只是读取的,对于给定的返回对象不应该更改,所以让它们是公共的,并使用const限定符防止修改

我使用模板来表示代码,使用
static\u assert
检查给定类型是否为枚举

缺点是:

  • 您可以传递任何枚举,而不仅仅是结果代码
  • make\u return\u object
    将为每个不同的枚举返回不同的类型

    • 您的错误不在第二个参数上,而是在第一个参数上。根据你的问题,我猜你有这样的代码:

      struct ReturnCode
      {
          enum class ClientCode
          {
              enum_FailedSocketConnection,
              // other values
          };
      };
      
      class ReturnObject
      {
      public:
          ReturnObject(ResultCode::ClientCode enum_code, QString data);
      
          QString getData();
          ResultCode::ClientCode getCode();
      
      private:
          ResultCode::ClientCode e_code;
          QString data_string;
      
      };
      
      因此,您得到了两种声明类型:
      ReturnCode
      ReturnCode::ClientCode
      。查看您的构造函数声明:

      `ReturnObject::ReturnObject(ResultCode enum_code, QString data)`
      
      它需要一个类型为
      ReturnCode
      的对象作为第一个参数,同时查看您的调用:

      ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "")
      
      将类型为
      ReturnCode::ClientCode
      的对象作为第一个参数传递

      您可以这样更改代码:

      struct ReturnCode
      {
          enum class ClientCode
          {
              enum_FailedSocketConnection,
              // other values
          };
      };
      
      class ReturnObject
      {
      public:
          ReturnObject(ResultCode::ClientCode enum_code, QString data);
      
          QString getData();
          ResultCode::ClientCode getCode();
      
      private:
          ResultCode::ClientCode e_code;
          QString data_string;
      
      };
      
      一旦你到了这里。您可以考虑将枚举排除在 ReultCu码< /C> >:

      enum class ClientCode
      {
          enum_FailedSocketConnection,
          // other values
      };
      
      class ReturnObject
      {
      public:
          ReturnObject(ClientCode enum_code, QString data);
      
          QString getData();
          ClientCode getCode();
      
      private:
          ClientCode e_code;
          QString data_string;
      
      };
      
      这遵循了“扁平比嵌套好”。这在C++中也是正确的。 编辑:

      return new ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "");
      
      class ReturnObject
      {
      public:
          ReturnObject(ResultCode enum_code, QString data);
      
          QString getData();
          ResultCode getCode();
      
      private:
          ResultCode e_code;
          QString data_string;
      
      };
      
      从您的评论来看,我们在这里讨论一个问题,您的代码需要重新设计。这是第一个命题:

      #include <type_traits>
      
      enum class ClientCode{
          // ...
          enum_FailedClientSocketConnection=12,
          // ...
      };
      
      template<typename T>
      struct ReturnObject
      {
          static_assert(std::is_enum<T>::value, "T should be an enum");
      
          const T e_code;
          const QString data_string;
      };
      
      template<typename T>
      ReturnObject<T> make_return_object(T e_code, std::string data_string)
      {
          return ReturnObject<T>{e_code, data_string};
      }
      
      // usage
      
      return make_return_object(
          ClientCode::enum_FailedClientSocketConnection, ""
      );
      
      #包括
      枚举类ClientCode{
      // ...
      enum_FailedClientSocketConnection=12,
      // ...
      };
      模板
      结构返回对象
      {
      静态_断言(std::is_enum::value,“T应该是一个enum”);
      常量代码;
      常量QString数据字符串;
      };
      模板
      ReturnObject生成\返回\对象(TEU代码,std::字符串数据\字符串)
      {
      返回返回对象{e_代码,数据_字符串};
      }
      //用法
      返回使返回对象(
      ClientCode::enum_FailedClientSocketConnection“”“
      );
      
      我删除了public const成员的访问器
      getData
      getCode
      :它们只是读取的,对于给定的返回对象不应该更改,所以让它们是公共的,并使用const限定符防止修改

      我使用模板来表示代码,使用
      static\u assert
      检查给定类型是否为枚举

      缺点是:

      • 您可以传递任何枚举,而不仅仅是结果代码
      • make\u return\u object
        将为每个不同的枚举返回不同的类型

      什么类型的
      ResultCode::ClientCode::enum\u FailedSocketConnection
      ?您需要
      ResultCode
      ,但传递的是
      ClientCode
      。没有构造函数接受
      ResultCode::ClientCode
      参数,但是你太确信第二个参数就是问题,而忽略了第一个参数。@GillBates我真傻,谢谢你指出这一点out@molbdnilo谢谢,我没看到!
      ResultCode::ClientCode::enum_FailedSocketConnection
      的类型是什么?您需要一个
      ResultCode
      ,但是您传递了一个
      ClientCode
      。没有构造函数接受
      ResultCode::ClientCode
      参数,但是你太确信第二个参数就是问题,而忽略了第一个参数。@GillBates我真傻,谢谢你指出这一点out@molbdnilo谢谢,我没看到!是啊!谢谢但是有一个问题,您的派生代码几乎是正确的,请参阅我的更新,我有一个嵌套的枚举。我需要强制转换我的
      ResultCode: