当类成员参数具有相同名称时,如何定义构造函数?

Posted

技术标签:

【中文标题】当类成员参数具有相同名称时,如何定义构造函数?【英文标题】:How can I define constructor when the class member parameters have the same name? 【发布时间】:2020-06-14 14:41:41 【问题描述】:
class MyStrValArray

private:
   vector<char> p;
public:
   MyStrValArray(const int n = 10, const int i = 1, const char ch = 'a')
   
   ~MyStrValArray();
   void init(const int n);
   void clear();
   unsigned capacity();
   unsigned size();
   char get(const int i);
   void set(const char ch, const int i);
   void remove(const unsigned int i);
   void pushData(const char ch);
   char showData();
;

这是我写的课程。 某些类成员函数具有相同的参数名称,例如chi。 这种情况下,类成员参数同名的情况下怎么定义构造函数呢?

+) 我想检查构造函数是否定义好,所以在主函数中,我写了p2.init(),没有任何参数。 像这样:

    MyStrValArray p2;
    p2.init();

init 函数如下所示:

void MyStrValArray::init(const int n) //Done

   p.reserve(n);
   cout << "a vector with size " << n << " created" << endl;

我收到了这条消息:

error: no matching function for call to 'MyStrValArray::init()'| 

我也写过:

p2.get();
p2.set();

char MyStrValArray::get(const int i)

   return p.at(i);


void MyStrValArray::set(const char ch, const int i)

   p[i] = ch;
   cout << "p[" << i << "]" << "changed to " << ch << endl;

p2.get()p2.set()也有同样的错误。

可能是什么问题?

【问题讨论】:

函数参数的名称不会在函数之间发生冲突,所以你很好。 我想检查构造函数是否定义良好,所以在主函数中我写了 p2.init(),没有任何参数,我得到这个消息:“错误:没有匹配的函数调用'MyStrValArray::get()'|". 然后将该信息添加到问题中。 (作为代码,而不是文本描述)。另外,制作一个mre。我们无法使用提供的代码重现您的错误。 您的代码似乎没有在任何地方调用get,错误来自哪行代码? 您需要将参数传递给get等,或者使用默认参数声明它们。请参阅下面的答案。 【参考方案1】:

您使用 integer 参数声明并定义了 init 函数

class MyStrValArray

 public:
       void init(const int n);
       // ...


void MyStrValArray::init(const int n)
//                       ^^^^^^^^^^^^ --> argument n

   // ...code

这意味着调用函数只能在传递参数的情况下工作。你应该这样做

 MyStrValArray p2;
 p2.init(3); // pass the `n`

如果您打算在没有任何参数的情况下调用,则应提供default argument to it

class MyStrValArray

 public:           
      void (const int n = 3); // declaration: provide the default argument
      //    ^^^^^^^^^^^^^^^^
      // ...


void MyStrValArray::init(const int n) // definition

    // ...code

现在你可以

 MyStrValArray p2;
 p2.init(); // the n = 3

error: no matching function for call to 'MyStrValArray::get()'|”。 可能是什么问题?

上面提到的也适用于MyStrValArray::get()函数的情况。因此错误。选择上述方法之一来解决问题。

【讨论】:

以上是关于当类成员参数具有相同名称时,如何定义构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用与 C++ 标准允许的成员变量相同的名称为构造函数参数初始化成员变量? [复制]

为啥当类包含任何参数化构造函数时编译器不提供默认构造函数? [复制]

构造函数的定义和构造函数的重载

第19课 - 对象的构造(下)

Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

构造函数