清理基类中矢量的实例化

时间:2017-07-14 17:50:54

标签: c++ class c++11 vector

我正在使用C ++ 11中的代码,并且与类构造和向量值相关的部分代码已经失控。我怎样才能使这更简洁?

我的工作与版本有关,并创建了一个类型为std::vector<uint16_t>的版本号矢量,以保存一组值来表示格式1.0.0.25的版本。我希望所有类都有一个版本,所以我把它放在基类中。然后孩子继承Base并实例化版本。

目前,我的代码有一个Version类,一个Base类和一个Child类。开发人员将通过在Child类的define变量中设置值来对版本进行硬编码。我希望这很容易看到和阅读。我的问题是,Child类传递值的部分目前非常难看,我希望能让它更简洁,更易读。

代码是:

#include <vector>

namespace CodeStuff
{
namespace VersionStuff
{


typedef uint16_t VersionType;

class Version
{

public:
    Version(const std::vector<VersionType> & aNumbers, const VersionType aType = -1)
    {
        numbers_ = aNumbers;
        type_ = aType;
    }
private:
    std::vector<VersionType> numbers_;
    VersionType type_;
};

} // end namespace VersionStuff
} // end namespace CodeStuff

class Base
{
public:
    Base(const CodeStuff::VersionStuff::Version & aVersion) : version_(aVersion)
    {
    }

    const CodeStuff::VersionStuff::Version getVersion() const {return version_;}

private:
    const CodeStuff::VersionStuff::Version version_;
};


#define CHILD_VERSION {1, 0, 0, 25}

class Child : public Base
{
public:
    Child() : Base(CodeStuff::VersionStuff::Version{std::vector<CodeStuff::VersionStuff::VersionType>{CHILD_VERSION}}) {}
};



int main(int argc, const char * argv[]) {

    Child myChild();
}

我的问题是,虽然我喜欢在#define CHILD_VERSION {1, 0, 0, 25}中轻松查看版本,但构造函数调用非常难看:

 Child() : Base(CodeStuff::VersionStuff::Version{std::vector<CodeStuff::VersionStuff::VersionType>{CHILD_VERSION}}) {}

我想这样做:

Child() : Base(CHILD_VERSION) {}

但是在XCode中,这会导致&#34; No Matching Constructor的错误初始化类型为Base&#34;。因为这是有效的语法:

std::vector<uint16_t> v({1, 0 ,0 ,25}); 

我不确定为什么短Base(CHILD_VERSION)在c ++ 11中不起作用。

我该如何缩短这个?

1 个答案:

答案 0 :(得分:1)

我最近处理了类似的事情,而不是传递一个向量,我使用std::initializater_list作为简单常量版本号的路径。这是一个例子:

class Version {
  std::vector<unsigned> version;
 public:
  Version(const std::string & s);
  Version(std::initializer_list<unsigned> list) : version(list) {}
  bool operator== (const Version & other) const {
    return version == other.version;
  }
  bool operator< (const Version & other) const {
    return version < other.version;
  }
};

这里可以像这样创建一个版本:

Version v{1, 0 ,0 ,25};

您也可以让您的基类拥有std::initializer_list构造函数,并将其传递给您的version_对象。