Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++;如何将名称传递给基类的构造函数_C++_Class_Constructor_Arguments_Base - Fatal编程技术网

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

C++ c++;如何将名称传递给基类的构造函数,c++,class,constructor,arguments,base,C++,Class,Constructor,Arguments,Base,我有两个类,我希望子类的每个对象都有一个名称,作为参数传递给超类的构造函数。我该怎么做 class base { public: base(const char * name) {name = name;} const char * getName() {return name;}; private: const char * name; }; class derived : public base { public: derived(c

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

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();
}
int main(int argc,char**argv)
{
衍生d(“测试”);

std::cout您需要为参数选择更好的名称
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

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

问题发生是因为您将代码< >名称<代码>分配给自己。所以成员变量<代码> const char *名称< /C>不会有正确的值。因为这是C++,但您应该真正使用<代码> STD::String < /C> >:

#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) {}
};
#包括
阶级基础
{
公众:
基(std::string name){m_name=name;}
std::string getName(){return m_name;};
私人:
std::字符串m_名称;
};
派生类:公共基
{
公众:
派生(std::string name):基(name){}
};

代码> 问题发生是因为您将代码> >名称<代码>本身。所以成员变量<代码> const char *名称< /C>不会有正确的值。因为这是C++,但您应该真正使用<代码> STD::String < /C> >:

#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) {}
};
#包括
阶级基础
{
公众:
基(std::string name){m_name=name;}
std::string getName(){return m_name;};
私人:
std::字符串m_名称;
};
派生类:公共基
{
公众:
派生(std::string name):基(name){}
};

您的问题是在构造函数主体中使用
名称的方式,它是本地参数。要修复代码,请使用初始化列表或通过
引用成员名称

示例1(首选成员列表!):

示例2(使用
,非首选):


您的问题是如何在构造函数体中使用
名称
,它是本地参数。要修复代码,请使用初始化列表或通过
引用成员名称

示例1(首选成员列表!):

示例2(使用
,非首选):

  • name
    在构造函数中使用了两次,您可以将成员更改为
    name\u
    ,例如:

    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 < /C> >而不是<代码> char */COD>名称。

  • class base
    中,没有为
    name
    分配内存(在这种情况下,最好使用
    strcpy()
    复制数据,而不是保留指向常量参数的指针)

      • name
        在构造函数中使用了两次,您可以将成员更改为
        name\u
        ,例如:

        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 < /C> >而不是<代码> char */COD>名称。

      • class base
        中,没有为
        name
        分配内存(在这种情况下,最好使用
        strcpy()
        复制数据,而不是保留指向常量参数的指针)


      您对
      名称的使用有疑问

      显而易见的答案是:

      使参数和成员变量的符号明确无误。


      您的代码可以按如下方式修复:

      #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;
      }
      
      #包括
      阶级基础
      {
      公众:
      base(const char*name){name\uu=name;}
      const char*getName(){返回名称};
      私人:
      
      const char*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;
      }
      
      #包括
      阶级基础
      {
      公众:
      base(const char*name){name\uu=name;}
      const char*getName(){返回名称};
      私人:
      常量字符*名称;//
      未执行预期的操作。在函数中,参数
      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
      会隐藏成员变量
      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;
      };
      

      在成员名称后面加下划线的原因是什么?@SergeyA-这是命名成员的一种选择。例如:Danny,我知道很多愚蠢的指南都有。(顺便说一句,google指南是超级愚蠢的。你为什么要遵循它?@SergeyA-哦,我不遵循它(在这种情况下,这只是更改名称的最简单方法).实际上,我大部分时间都有点拘泥于MFC(很难将两者混用)。那会是这样的:m_strName-你更喜欢这个吗?:)我?我喜欢名字。简单明了,能表达所有的意思。在成员名字后面加下划线的原因是什么?@SergeyA-这是命名成员的一种选择。例如:Danny,我知道很多愚蠢的指南都有(