2017-07-14 48 views
0

我正在研究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中,这会导致错误“N o匹配类型Base的初始化的构造函数“。因为这是有效的语法:

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

我不确定为什么短期Base(CHILD_VERSION)没有在C++ 11的工作。

我该如何缩短这个?

+1

为什么不使用带有4个值的结构? – 2017-07-14 18:04:54

+0

@ manni66在完整版本中,列表可以是任意长度并且处理更广泛的功能。 – Steve

回答

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_对象。

+0

为什么编译器不会将我的初始化程序列表转换为像普通的向量?我想使用这个,并保持构造函数的矢量代码已经使用一个向量。 – Steve

+2

@Steve代码只允许执行一个隐式构造函数。允许你做{1,2,3,4}的向量构造函数是一个构造函数,它接受一个初始化列表,但没有带4个参数的向量构造函数。编译器不允许说“我希望这是一个向量,并且向量有一个与传递的参数相匹配的初始化程序列表构造函数,所以我将把参数转换为初始化程序列表,然后转换为向量” - 事实上,它需要2跳从你所在的位置到你想要咬你的地方。 – Charlie