将空字符串传递给构造函数 注:我对C++仍然是新的,虽然这可能是一个简单的问题,但我无法找到解决方案。
目的: 我想向我的构造函数传递一个空字符串(就像在java/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
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: