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

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; },c++,C++,我知道使用初始化方法是一种不好的做法,因为使用老式的编码方式或避免在构造函数中使用异常。但我在这里的目标是减少代码,所以除非stackoverflow的某位大师说相反的话,否则我认为这没有错(但我是来学习的,所以请摧毁我所有的信念) 问题是,我收到了一个警告,因为我没有在协构造函数中初始化类成员。编译器不希望它们在Initialize方法中初始化。那么,有什么办法能让编译器开心呢?我应该忘记aboput初始化方法的用法吗?我会使用构造函数委托,类似于: #include <iostream

我知道使用初始化方法是一种不好的做法,因为使用老式的编码方式或避免在构造函数中使用异常。但我在这里的目标是减少代码,所以除非stackoverflow的某位大师说相反的话,否则我认为这没有错(但我是来学习的,所以请摧毁我所有的信念)


问题是,我收到了一个警告,因为我没有在协构造函数中初始化类成员。编译器不希望它们在Initialize方法中初始化。那么,有什么办法能让编译器开心呢?我应该忘记aboput初始化方法的用法吗?

我会使用构造函数委托,类似于:

#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;
}
#包括
使用名称空间std;
福班
{
公众:
foo()
:foo(1,“2”,3.)//使用默认值委托给另一个构造函数。。。
{ }
foo(inta,std::stringb,double c)
:_a(a),_b(b),_c(c)
{ }
私人:
国际组织;
std::字符串_b;
双c;
};
int main(){
foo f1{};
foo f2{1,“3”,4};
返回0;
}

需要注意的是,您至少可以使用c++11…

我将使用构造函数委托,类似于:

#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;
}
#包括
使用名称空间std;
福班
{
公众:
foo()
:foo(1,“2”,3.)//使用默认值委托给另一个构造函数。。。
{ }
foo(inta,std::stringb,double c)
:_a(a),_b(b),_c(c)
{ }
私人:
国际组织;
std::字符串_b;
双c;
};
int main(){
foo f1{};
foo f2{1,“3”,4};
返回0;
}

<> P> >警告,你至少可以使用C++ 11……/P>请显示类的声明,并认真考虑使用<代码> STD::String < /C> >,而不是摆弄char * CistasCask和StrcPy(除非你使用一些没有字符串的奇怪标准库)。这个代码是在寻找问题。@斯蒂恩,是的,我更喜欢STD::String,但是遗憾的是,我继承了很多人学习的代码,而不是C++,我负担不起迁移的全部。我将在这里更新类声明Now Compiles fine(VS2013,gcc 4.8.3)-除了
FIR
没有在任何地方声明之外,我必须猜测
POSITION\u SIZE
ID\u LENGTH
。请发布导致问题的确切代码,并说明编译器/version@stijn这不是问题,而是警告:“成员attribute1未在此构造函数中声明”。当试图向给定示例添加APT当前代码时,FIR是一个输入错误。确切的代码就是这样,有更多的类成员,它们都在Initialize方法中初始化。我只是想知道如何避免警告消息(在defautl构造函数中是关于attribute1的,在另一个构造函数中是关于attribute2的,这很有趣),或者如果我在这里做了一些不好的操作,应该重新安排并忘记初始化方法“not declared in this constructor”不会给出Single搜索结果。真的很想知道你使用的是什么编译器。请显示类的声明,并认真考虑使用<代码> STD::String ,而不是摆弄char * COSTYSTCAST和StrcPy(除非你使用一些没有字符串的奇怪标准库)。这个代码是在寻找问题。@斯蒂恩,是的,我更喜欢STD::String,但是遗憾的是,我继承了很多人学习的代码,而不是C++,我负担不起迁移的全部。我将在这里更新类声明Now Compiles fine(VS2013,gcc 4.8.3)-除了
FIR
没有在任何地方声明之外,我必须猜测
POSITION\u SIZE
ID\u LENGTH
。请发布导致问题的确切代码,并说明编译器/version@stijn这不是问题,而是警告:“成员attribute1未在此构造函数中声明”。当试图向给定示例添加APT当前代码时,FIR是一个输入错误。确切的代码就是这样,有更多的类成员,它们都在Initialize方法中初始化。我只是想知道如何避免警告消息(在defautl构造函数中是关于attribute1的,在另一个构造函数中是关于attribute2的,这很有趣),或者如果我在这里做了一些不好的操作,应该重新安排并忘记初始化方法“not declared in this constructor”不会给出Single搜索结果。真的很想知道你在使用什么编译器。我不允许使用C++11:(.构造函数委托在C++03上可用吗?不。不幸的是,没有干净的方法可以做到这一点,你有几个选项,所有这些都仍然很混乱,1.继承-将你所有的东西收集到基类中,然后使用基类构造函数,2.pimpl(隐藏您的实现并使用属性构造实现…)等。我不允许使用C++11:(.C++03上是否有构造函数委托?没有。不幸的是,没有干净的方法可以做到这一点,您有几个选项,所有这些选项都仍然很混乱,1.继承-将所有内容收集到基类中,然后使用基类构造函数,2.pimpl(隐藏您的实现并使用属性构造实现…)等等。