将空字符串传递给构造函数
Pass empty string to constructor
注意:我还是 c++ 的新手,虽然这可能是一个简单的问题,但我找不到解决方案。
目的:
我想将一个空字符串(就像 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
和一个string
。
这个错误是什么意思,我该如何解决?
我试图将我的构造函数参数从 QString data
更改为 char data
并使用 ''
调用,但这导致了错误 empty character constant
.
调用代码:
return new ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "");
header:
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;
}
感谢 wasthishelpful 和一些评论,我犯了一个悲惨的逻辑错误,让我看到了错误的参数,解决方案是我应该转换我的枚举 class ResultCode
这是嵌套 class
之一的 parent class,在本例中为 ClientCode
,如下面的枚举 [=63] =] header
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
};
};
所以你最终得到了两个声明的类型:ReturnCode
和 ReturnCode::ClientCode
。查看您的构造函数声明:
`ReturnObject::ReturnObject(ResultCode enum_code, QString data)`
它需要一个 ReturnCode
类型的对象作为第一个参数,同时查看您的调用:
ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "")
您将 ReturnCode::ClientCode
类型的对象作为第一个参数传递。
您可以这样更改您的代码:
class ReturnObject
{
public:
ReturnObject(ResultCode::ClientCode enum_code, QString data);
QString getData();
ResultCode::ClientCode getCode();
private:
ResultCode::ClientCode e_code;
QString data_string;
};
一旦你在这里。您可以考虑从 ResultCode
:
中取出枚举
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;
};
这遵循 Zen of Python:"Flat is better than nested"。恕我直言,这在 C++ 中也是如此。
编辑:
从您的意见来看,我们正处于 XY problem,您的代码需要重新设计。这是第一个命题:
#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, ""
);
我为 public const 成员删除了访问器 getData
和 getCode
:它们只是被读取,对于给定的 return 对象不应该改变,所以让它们是 public,带有 const 限定符以防止修改。
我用模板来表示代码,用static_assert
检查给定的类型是枚举。
缺点是:
- 您可以传递任何枚举,而不仅仅是您的结果代码。
make_return_object
将为每个不同的枚举 return 不同的类型。
注意:我还是 c++ 的新手,虽然这可能是一个简单的问题,但我找不到解决方案。
目的:
我想将一个空字符串(就像 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
和一个string
。
这个错误是什么意思,我该如何解决?
我试图将我的构造函数参数从 QString data
更改为 char data
并使用 ''
调用,但这导致了错误 empty character constant
.
调用代码:
return new ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "");
header:
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;
}
感谢 wasthishelpful 和一些评论,我犯了一个悲惨的逻辑错误,让我看到了错误的参数,解决方案是我应该转换我的枚举 class ResultCode
这是嵌套 class
之一的 parent class,在本例中为 ClientCode
,如下面的枚举 [=63] =] header
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
};
};
所以你最终得到了两个声明的类型:ReturnCode
和 ReturnCode::ClientCode
。查看您的构造函数声明:
`ReturnObject::ReturnObject(ResultCode enum_code, QString data)`
它需要一个 ReturnCode
类型的对象作为第一个参数,同时查看您的调用:
ReturnObject(ResultCode::ClientCode::enum_FailedSocketConnection, "")
您将 ReturnCode::ClientCode
类型的对象作为第一个参数传递。
您可以这样更改您的代码:
class ReturnObject
{
public:
ReturnObject(ResultCode::ClientCode enum_code, QString data);
QString getData();
ResultCode::ClientCode getCode();
private:
ResultCode::ClientCode e_code;
QString data_string;
};
一旦你在这里。您可以考虑从 ResultCode
:
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;
};
这遵循 Zen of Python:"Flat is better than nested"。恕我直言,这在 C++ 中也是如此。
编辑:
从您的意见来看,我们正处于 XY problem,您的代码需要重新设计。这是第一个命题:
#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, ""
);
我为 public const 成员删除了访问器 getData
和 getCode
:它们只是被读取,对于给定的 return 对象不应该改变,所以让它们是 public,带有 const 限定符以防止修改。
我用模板来表示代码,用static_assert
检查给定的类型是枚举。
缺点是:
- 您可以传递任何枚举,而不仅仅是您的结果代码。
make_return_object
将为每个不同的枚举 return 不同的类型。