将空字符串传递给构造函数

时间:2016-10-12 14:18:00

标签: c++ qt c++11 char qstring

注意:我还是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的目的是封装enumstring

这个错误意味着什么,我该如何解决?

我尝试将构造函数参数从QString data更改为char data并使用''进行调用,但这导致错误empty character constant

致电代码:

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

感谢 wasthishelpful 和一些评论,我做了一个悲剧性的逻辑错误让我看错了参数,解决方法是我应该投出我的枚举类ResultCode这是嵌套class es之一的父类,在本例中为ClientCode,如下面的enum类标题所示

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

1 个答案:

答案 0 :(得分:2)

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

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

所以你最终得到了两种声明的类型:ReturnCodeReturnCode::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优于嵌套"。恕我直言,这在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, ""
);

我为公共const成员删除了访问器getDatagetCode:它们只是被读取,并且不应该为给定的返回对象更改,所以让它们公开,使用const限定符来防止修改

我使用模板来表示代码,使用static_assert来检查给定类型是否为枚举。

缺点是:

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