当类成员参数具有相同名称时,如何定义构造函数?
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();
;
这是我写的课程。
某些类成员函数具有相同的参数名称,例如ch
、i
。
这种情况下,类成员参数同名的情况下怎么定义构造函数呢?
+) 我想检查构造函数是否定义好,所以在主函数中,我写了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】:
您使用 int
eger 参数声明并定义了 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++ 标准允许的成员变量相同的名称为构造函数参数初始化成员变量? [复制]
为啥当类包含任何参数化构造函数时编译器不提供默认构造函数? [复制]
Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )