C ++类成员未初始化(在构造函数中,但在initialize方法时)

时间:2015-01-15 08:29:32

标签: c++

我有一个带有两个构造函数的C ++类(默认的一个,另一个带参数)。为了重用代码,我避免在构造函数级别初始化类成员,而是在Initialize方法中进行,我从两个构造函数调用它。这样,我就是在尽量减少代码行和重复代码:

Location::Location(){
    double pos[POSITION_SIZE] = {0};
    this->Initialize(const_cast<char*>(""), const_cast<char*>(""), pos);
}


Location::Location(char *id, char *code, double pos[POSITION_SIZE]){
    this->Initialize(id, code, pos);
}


void Location::Initialize(char *id, char *code, double pos[POSITION_SIZE]){
    strcpy(this->ID, id);
    strcpy(this->code, code);

    this->position[0] = pos[0];
    this->position[1] = pos[1];
    this->position[2] = pos[2];

    this->attribute1 = 0;
    this->attribute2 = 0;
}

头:

class Location{
public:
    Location();
    Location(char *id, char *code, double pos[POSITION_SIZE]);

private:
    // This method initializes the location attributes given as parameters
    void Initialize(char *id, char *code, double pos[POSITION_SIZE]);

    // Name/identifier of the location
    char ID[ID_LENGTH];
    // FIR identifier
    char code[ID_LENGTH];
    // Location's coordinates (lat, lon, alt)
    double position[POSITION_SIZE];
    // Attribute 1
    double attribute1;
    // Attribute 2
    double attribute2;
};

我知道使用初始化方法在使用时是一个糟糕的实践,因为旧的学校编码风格或避免在构造函数中使用异常。但我的目标是减少代码,所以除非一些stackoverflow的大师说相反,我认为这没有错(但我在这里学习,所以请销毁我的所有信念)。

问题是我收到的警告是没有在cosntructor中初始化类成员。编译器不喜欢它们在Initialize方法初始化。那么,任何让编译器满意的方法呢?我应该忘记aboput Initialize方法用法吗?

1 个答案:

答案 0 :(得分:4)

我会使用构造函数委托,例如:

#include <iostream>
using namespace std;

class foo
{
public:
    foo()
    : foo(1, "2", 3.) // delegate to the other constructor with defaults...
    { }

    foo(int a, std::string b, double c)
    : _a(a), _b(b), _c(c)
    { }

private:
    int _a;
    std::string _b;
    double _c;
};

int main() {
    foo f1{};
    foo f2{1, "3", 4.};
    return 0;
}

请注意,您可以使用至少c ++ 11 ...