Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类实例化期间未设置继承的值_C++ - Fatal编程技术网

C++ 在类实例化期间未设置继承的值

C++ 在类实例化期间未设置继承的值,c++,C++,我的所有对象都有这个父类 #pragma once #include <string> /* Main parent class. */ class Object { protected: std::string className; public: std::string getClassName() { return className; } }; 出了什么问题?这是因为从main调用的单参数构造函数将className变量保留为

我的所有对象都有这个父类

#pragma once
#include <string>
/*
    Main parent class.
*/
class Object
{
protected:
    std::string className;
public:
    std::string getClassName() {
        return className;
    }
};

出了什么问题?

这是因为从
main
调用的单参数构造函数将
className
变量保留为空。将构造函数定义更改为

Skill(std::string skillName) {
    className = "skill";
    this->skillName = skillName;
}
或者从此调用另一个构造函数(仅适用于
C++11

不过,最好使用初始值设定项列表

Skill(std::string skillName) : skillName(skillName) {
    className = "skill";
}

问题是调用单参数构造函数不会调用零参数构造函数,因此永远不会设置
className

如果您使用的是C++11,则可以委托给默认构造函数以避免代码重复:

Skill(std::string skillName) : Skill(){
    this->skillName = skillName;
}
或者,可以使用带有默认参数的单个构造函数:

Skill(std::string skillName = "") : skillName(skillName){
    className = "skill"; //better to write an Object constructor to handle this
}

下面的两个答案是正确的:您从未调用
Skill()
构造函数。还有一件事:我注意到您包含了
“object.cpp”
文件。为什么要添加.cpp文件而不是.h文件?您应该只将类声明(然后包括)放在标题中(否则在更复杂的情况下,您将遇到严重的问题,例如多个变量定义)
Skill(std::string skillName) : Skill(){
    this->skillName = skillName;
}
Skill(std::string skillName = "") : skillName(skillName){
    className = "skill"; //better to write an Object constructor to handle this
}