c ++如何将名称传递给base class的构造函数
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
分配给自身。所以成员变量 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
的方式,它是局部参数。要修复代码,请使用初始化列表或通过 this
.
引用成员名称
示例 1(成员列表,首选!):
base(const char * name) : name(name) {}
示例 2(使用 this
,不是首选):
base(const char * name) : { this->name = name; }
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()
复制数据而不是保留指针到常量参数)。
您对 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;
}
请看working demo。
base(const char * name) {name = name;}
没有按照您的预期进行。在函数中,参数 name
隐藏了成员变量 name
。因此,成员变量永远不会被初始化。
您可以使用:
base(const char * name) : name(name) {}
或更好
base(const char * nameIn) : name(nameIn) {}
进一步改进建议:
成员变量使用std::string
。那么你的class就不用去处理调用构造函数后指针变成悬空指针可能出现的问题了
class base
{
public:
base(const char * nameIn) : name(nameIn) {}
std::string const& getName() {return name;} const;
private:
std::string name;
};
我有两个 类 并且我希望 子类 的每个对象都有一个名称,该名称作为参数传递给 的构造函数超类。我该怎么做?
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
分配给自身。所以成员变量 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
的方式,它是局部参数。要修复代码,请使用初始化列表或通过 this
.
示例 1(成员列表,首选!):
base(const char * name) : name(name) {}
示例 2(使用 this
,不是首选):
base(const char * name) : { this->name = name; }
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()
复制数据而不是保留指针到常量参数)。
您对 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;
}
请看working demo。
base(const char * name) {name = name;}
没有按照您的预期进行。在函数中,参数 name
隐藏了成员变量 name
。因此,成员变量永远不会被初始化。
您可以使用:
base(const char * name) : name(name) {}
或更好
base(const char * nameIn) : name(nameIn) {}
进一步改进建议:
成员变量使用std::string
。那么你的class就不用去处理调用构造函数后指针变成悬空指针可能出现的问题了
class base
{
public:
base(const char * nameIn) : name(nameIn) {}
std::string const& getName() {return name;} const;
private:
std::string name;
};