gpt4 book ai didi

c++ - MySet(20,100) = "abcd";复制和/或分配?

转载 作者:行者123 更新时间:2023-11-30 02:04:39 34 4
gpt4 key购买 nike

很抱歉,如果这个答案应该是显而易见的,也许这有一个模式名称,如“dopey assignment overload”并且没有按正确的主题搜索 - 重定向最受欢迎代码摘录:

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++ 提示....:myset.cxx:19:16: error: expected ‘,’ or ‘;’ before ‘=’ token

不是大问题,但一直在努力理解为什么无效。

感谢任何有帮助的回复。

更多信息...我想编辑我的操作?

关于为什么上面的内容被认为是非法的,一直在寻找一个明确的原因......当然还有一个让编译器接受这种表示法的技巧。

考虑合法的类似用途

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 的符号中,这将是一个熟悉的语句,在我宣布它是非法的之前,我想检查一下是否遗漏了一个技巧。

谢谢。

最佳答案

因为

MySet C(1,10) = "hello";

是非法的。初始化变量时不能调用赋值或其他任何方法。

如果它确实有效,= 将代表初始化,而不是赋值。

就像:

int x = 5;  //initialization, not assignment

相当于

int x(5);

不是

int x;
x = 5;

关于c++ - MySet(20,100) = "abcd";复制和/或分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10380613/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com