c++ 如何将名称传递给基类的构造函数
c++ How to pass a name to the constructor of base class
我有两个类,我希望子类的每个对象都有一个名称,该名称作为参数传递给超类的构造函数。我该怎么做?
class base
{
public:
base(const char * name) {name = name;}
const char * getName() {return name;};
private:
const char * name;
};
class derived : public base
{
public:
derived(const char * name) : base(name) {}
};
然而
int main(int argc, char **argv)
{
derived d("test");
std::cout << d.getName();
}
生成乱码作为控制台输出。
您需要
为参数name
选择更好的名称:
base(const char * p_name) {name = p_name;}
在代码中,您只是为自己分配名称。
其他可能的解决方案:
base(const char * name) : name(name) {} // preferred one
base(const char * name) {base::name = name;}
base(const char * name) {this->name = name;}
您的问题是您在构造函数主体中使用name
的方式,它是本地参数。要修复代码,请使用初始化列表或通过 this
引用成员名称。
示例 1(成员列表,首选!
base(const char * name) : name(name) {}
示例 2(使用 this
,不是首选):
base(const char * name) : { this->name = name; }
base(const char * name) {name = name;}
没有做你所期望的。在函数中,参数name
阴影成员变量name
。因此,成员变量永远不会被初始化。
您可以使用:
base(const char * name) : name(name) {}
或更好
base(const char * nameIn) : name(nameIn) {}
进一步改进的建议:
对成员变量使用 std::string
。然后,您的类不必处理在调用构造函数后指针变为悬空指针时可能出现的问题。
class base
{
public:
base(const char * nameIn) : name(nameIn) {}
std::string const& getName() {return name;} const;
private:
std::string name;
};
出现此问题是因为您正在将name
分配给自身。因此,成员变量const char * name
将没有正确的值。由于这是C++尽管您确实应该使用std::string
:
#include <string>
class base
{
public:
base(std::string name) {m_name = name;}
std::string getName() {return m_name;};
private:
std::string m_name;
};
class derived : public base
{
public:
derived(std::string name) : base(name) {}
};
您对name
符号使用不明确有问题。
显而易见的答案是:
使参数和成员变量的符号明确。
您的代码可以像这样修复:
#include <iostream>
class base
{
public:
base(const char * name) {name_ = name;}
const char * getName() {return name_;};
private:
const char * name_; // <<< Just make the member variable unambiguous.
};
class derived : public base
{
public:
derived(const char * name) : base(name) {}
};
int main(int argc, char **argv)
{
derived d("test");
std::cout << d.getName() << std::endl;
}
请参阅工作演示。
-
name
在构造函数中使用两次,则可以将成员更改为name_
,例如:class base { public: base(const char * name) {name_ = name;} const char * getName() {return name_;}; private: const char * name_; };
或使用初始化列表:
base(const char * name) : name(name) {}
如果要为参数和成员变量保留相同的名称。
-
在C++中,您可以使用
std::string
而不是char*
作为名称。 -
在
class base
中,没有为name
分配内存(在这种情况下,最好使用strcpy()
复制数据,而不是保留指向常量参数的指针)。
相关文章:
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 在成员构造函数之后调用基类构造函数
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 如何在 C++ 中将参数传递给基类构造函数
- 将数据成员的指针传递给基类构造函数是否安全?
- 使用基类构造函数初始化儿童类
- 使用基类构造函数的子类构造函数的大纲定义
- MSVC 无法识别继承模板类的模板类的"直接"基类构造函数
- 子类的构造函数后跟冒号后的基类构造函数是什么意思?
- 是否可以使用基类构造函数通过派生类将值初始化为基类私有成员?
- 当派生类无法轻易将参数传递到基类时,如何调用基类构造函数
- 是否可以在运行时切换到不同的基类构造函数?
- 对基类构造函数的未定义引用
- 如何为基类构造函数中的每个子类执行特定任务
- 将类传递到基类构造函数的模板参数中?
- 如何在基类构造函数中使用派生类成员
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 使用相同的参数调用基类C++构造函数