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

时间:2016-01-14 16:20:08

标签: c++ class constructor arguments base

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

#heartbackground {
    position: fixed;
    width: 100%;
    height: 100%;
    bottom: 0;
    left: 0;
}

然而,

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

作为控制台输出产生乱码。

6 个答案:

答案 0 :(得分:5)

您需要为参数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;}

答案 1 :(得分:1)

出现问题是因为您要为自己分配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) {}
};

答案 2 :(得分:1)

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

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

base(const char * name) : name(name) {}

示例2(使用this,不是首选):

base(const char * name) : { this->name = name; }

答案 3 :(得分:1)

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

答案 4 :(得分:1)

您在使用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

答案 5 :(得分:1)

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