没有调用适当的构造函数
Not calling the appropriate constructor
#include<iostream>
using namespace std;
class String
{
protected:
enum {SZ= 80};
char str[SZ];
public:
String (){str[0]='[=10=]';}
String(char s[])
{
strcpy(str,s);
}
void display() const
{
cout<<str;
}
operator char*()
{
return str;
}
};
class Pstring : public String
{
public:
Pstring(char s[])
{
if(strlen(s)>SZ-1)
{
for(int j=0;j<SZ-1;j++)
{
str[j]=s[j];
}
str[SZ-1]='[=10=]';
}
else
{String(s);}
}
};
int main()
{
Pstring s2 ="This is a strong string.";
cout<<"\ns2="; s2.display();
return 0;
}
s2.display()
returns 空白。调试发现Pstring中的String(s)
调用了Stringclass中的无参构造函数。我将其理解为具有一个参数的构造函数,因此应该调用 String(char s[])
。这是什么行为?
这段代码
else
{String(s);}
没有意义。
这一行
String(s);
是 String
类型的变量 s
的声明,其范围为 if 语句的 else 部分的复合运算符。
注意这个构造函数
Pstring(char s[])
在将控件传递给构造函数主体之前,隐式调用 class String 的默认构造函数。即只有在派生class的创建对象sub-objects全部被创建后,构造函数的主体才获得控制权。
您应该将对传递的字符串的检查放在 class String
.
的构造函数中
例如在 class String
你可以用下面的方式定义带参数的构造函数
String( const char s[] )
{
strncpy( str, s, SZ );
str[SZ - 1] = '[=13=]';
}
派生的 class 中的构造函数可以定义为
Pstring( const char s[] ) : String( s )
{
}
#include<iostream>
using namespace std;
class String
{
protected:
enum {SZ= 80};
char str[SZ];
public:
String (){str[0]='[=10=]';}
String(char s[])
{
strcpy(str,s);
}
void display() const
{
cout<<str;
}
operator char*()
{
return str;
}
};
class Pstring : public String
{
public:
Pstring(char s[])
{
if(strlen(s)>SZ-1)
{
for(int j=0;j<SZ-1;j++)
{
str[j]=s[j];
}
str[SZ-1]='[=10=]';
}
else
{String(s);}
}
};
int main()
{
Pstring s2 ="This is a strong string.";
cout<<"\ns2="; s2.display();
return 0;
}
s2.display()
returns 空白。调试发现Pstring中的String(s)
调用了Stringclass中的无参构造函数。我将其理解为具有一个参数的构造函数,因此应该调用 String(char s[])
。这是什么行为?
这段代码
else
{String(s);}
没有意义。
这一行
String(s);
是 String
类型的变量 s
的声明,其范围为 if 语句的 else 部分的复合运算符。
注意这个构造函数
Pstring(char s[])
在将控件传递给构造函数主体之前,隐式调用 class String 的默认构造函数。即只有在派生class的创建对象sub-objects全部被创建后,构造函数的主体才获得控制权。
您应该将对传递的字符串的检查放在 class String
.
例如在 class String
你可以用下面的方式定义带参数的构造函数
String( const char s[] )
{
strncpy( str, s, SZ );
str[SZ - 1] = '[=13=]';
}
派生的 class 中的构造函数可以定义为
Pstring( const char s[] ) : String( s )
{
}