class MySet {
private:
int lower;
int upper;
char *data;
public:
MySet( int l, int u, const char *val = 0 );
MySet &operator=( MySet &rhs );
MySet &operator=( const char *val );
};
int main(int i, const char *argv[])
{
MySet A(1,10);
A = "hello";
MySet B(1,10, "hello");
MySet C(1,10) = "hello";
}
A和B的作业分配,但对于C然后g ++ whines ......: myset.cxx:19:16:错误:在'='标记
之前预期','或';'不是一个大问题,但一直试图理解为什么无效。
感谢任何有用的回复。
更多信息...我想要编辑我的操作吗?
令人费解为什么以上被认为是非法的,一直在寻找一个明确的理由......当然还有一个技巧可以让编译器接受这种表示法。
考虑合法的类似用途
struct toons {
char first[10];
} flintstone[] = {
"fred",
"wilma",
""
};
来自几十年的C编译器,以及:
typedef struct {
char family[10];
struct {
char name[10];
} members[6];
} toongroup;
toongroup rubble = {
"rubble",
{
"barney",
"wilma",
""
}
}
toongroup rubble = {
"rubble",
{
"barney",
"wilma",
"", "", "", ""
}
};
toongroup jetsons = { "jetson", { "george", "jane", "", "", "", "" } };
所有c ++编译器都表示敬意。 可以在结构上有成员函数,它仍然有效:
typedef struct toongroup {
public:
bool add( const char *newbaby ) {
for(int i; i<6; i++) {
if(strlen(members[i].name) == 0) {
strcpy(members[i].name, newbaby);
return true;
}
if(strcmp(members[i].name, newbaby) == 0)
return false;
}
return false;
}
char family[10];
struct {
char name[10];
} members[6];
} toongroup;
toongroup jetsons = { "jetson", { "george", "jane", "", "", "", "" } };
jetsons.add( "elroy" );
在添加构造函数时开始出现异议:
typedef struct toongroup {
toongroup( const char *f, const char *m, ... ) {
}
error: in C++98 ‘rubble’ must be initialized by constructor, not by ‘{...}’
error: could not convert ‘{"rubble", {"barney", "wilma", "", "", "", ""}}’ from ‘<brace-enclosed initializer list>’ to ‘toongroup‘
想知道是否可以使用正确的初始化程序,因此编译器可以匹配构造函数
toongroup empty;
toongroup nobody = empty;
toongroup rubble( "rubble", "barney", "wilma", "" );
甚至
toongroup empty;
toongroup cancelled;
toongroup nobody = empty;
toongroup rubble( "rubble", "barney", "wilma", "" );
toongroup jetsons( "jetson", "george", "jane", "" );
jetsons.add( "elroy" );
添加
toongroup &operator=( toons &t );
允许
jetsons = cancelled;
但不是
toongroup jetsons( "jetson", "george", "jane", "" ) = cancelled;
为此结束长篇文章道歉,但我正在寻找关于为什么构造函数+作业被拒绝的一些参考以及关于如何/如果可以适应的任何想法。
在MySet的符号中这将是一个熟悉的声明,在我声明它非法想要检查是否错过了一个技巧。
感谢。
答案 0 :(得分:3)
由于
MySet C(1,10) = "hello";
是非法的。初始化变量时,不能调用赋值或其他任何内容。
如果确实有效,=
将代表初始化,而非分配。
就像:
int x = 5; //initialization, not assignment
相当于
int x(5);
而不是
int x;
x = 5;
答案 1 :(得分:1)
问题是当你写:
MySet C = "hello";
实际上,调用了字符数组中的构造函数(如果存在),而不是赋值运算符。因此,使用您的代码,您会混淆编译器:要调用的两个构造函数中的哪一个。
基本上声明行上的相等性转换为构造函数调用。从那时起,使用赋值运算符。
答案 2 :(得分:0)
记住2分:
=
不是
赋值运算符,但意味着构造
对象。记住这些,看看有问题的代码:
MySet C(1,10) = "hello";
这声明MySet
的对象并用(1,10)
构造它
现在使用= "hello"
没有必要再建一个,这会压倒现有的建筑。
这就是错误的原因。