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