c++ 如何将名称传递给基类的构造函数

c++ How to pass a name to the constructor of base class

本文关键字:基类 构造函数 c++      更新时间:2023-10-16

我有两个类,我希望子类的每个对象都有一个名称,该名称作为参数传递给超类的构造函数。我该怎么做?

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()复制数据,而不是保留指向常量参数的指针)。