2016-10-18 85 views
0

让我们考虑的定义:C++获取类成员的默认值,而无需创建新的对象

struct ClassWithMember 
{ 
    int myIntMember = 10; 
} 

我想得到myIntMember的默认值,但不创建另一个类的实例

// IMPOSSIBLE int myInt = ClassWithMember::myIntMember; 
// MUST AVOID int myInt = ClassWithMember().myIntMember; 

我知道解决办法,但不喜欢:

struct ClassWithMember 
{ 
    static const int myIntMember_DEFAULT = 10; 
    int myIntMember = myIntMember_DEFAULT; 
} 
int myInt = ClassWithMember::myIntMember_DEFAULT; 

因为它需要额外的线。而且我无法定义像static const int *const INTEGER11_DEFAULT = 0x100088855;这样的内联静态指针,这样的指针必须在.cpp文件中定义,在.hpp中只是声明。我的许多课程只有标题,因此为此值创建多余的.cpp不是个好主意。

Here是C#

+1

“我知道解决方法,但不喜欢它”....可能是你应该解释为什么? – HazemGomaa

+0

因为它需要多一行。我不能像'static const int * const INTEGER11 = 11;'那样定义内联静态指针,指针必须在'.cpp'文件中定义,仅在'.hpp'声明中定义。 – kyb

+0

“static const int * const INTEGER11 = 11”不是有效语句,这与上面提到的所有关于可访问性的问题都不相同......请编辑您的问题以符合您的真正需求。 – HazemGomaa

回答

1

了类似的问题,我把这个解决方案解决办法

struct ClassWithMember 
{ 
    static const int myIntMember_DEFAULT = 10; 
    int myIntMember = myIntMember_DEFAULT; 
} 
int myInt = ClassWithMember::myIntMember_DEFAULT; 

为指针,它看起来更复杂

//.hpp 
struct ClassWithMember 
{ 
    static AnotherClass* const myMember_DEFAULT; //=X; Assignment not allowed 
    AnotherClass* myMember = myMember_DEFAULT; 
} 
//.cpp 
AnotherClass* const MyNamespace::ClassWithMember::myMember_DEFAULT = pAnotherInstance; 
//usage 
auto *my = ClassWithMember::myMember_DEFAULT; 
2

我想,对于你,只是另一种解决方法,但我认为是一点点(只有一点)更实用。

如果将默认值保存为静态方法返回的静态常量,则可以避免cpp文件中出现额外的行。

下面的例子做一个模板包装的伎俩(默认值与默认vaule模板参数,只是为了好玩),但模板部分只是为了避免在这个例子中的代码重复

#include <iostream> 

template <typename T, T defTpl = T{}> 
struct wrapperWithDef 
{ 
    static T getDefVal() 
    { static T const def { defTpl }; return def; } 

    T myTMember { getDefVal() }; 
}; 

int main() 
{ 
    wrapperWithDef<int>   wi; 
    wrapperWithDef<long, 3L>  wl; 
    wrapperWithDef<int *>  wp; 

    // print "0, 3, (nil)" (clang++) or "0, 3, 0" (g++) 
    std::cout << wi.myTMember << ", " << wl.myTMember << ", " 
     << wp.myTMember << std::endl; 

    // print "5, (nil), 1" (clang++) or "5, 0, 1" (g++) 
    std::cout << wrapperWithDef<unsigned, 5U>::getDefVal() << ", " 
     << wrapperWithDef<long *>::getDefVal() << ", " 
     << wrapperWithDef<bool, true>::getDefVal() << std::endl; 

    return 0; 
} 
相关问题