MySet(20,100)=“abcd”;复制和/或分配?

时间:2012-04-30 08:29:19

标签: c++ operator-keyword compound-assignment

如果这个答案应该是显而易见的,请道歉,或许这有一个模式名称,如“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 ++ 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的符号中这将是一个熟悉的声明,在我声明它非法想要检查是否错过了一个技巧。

感谢。

3 个答案:

答案 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分:

  1. 声明变量时,后续的= 不是 赋值运算符,但意味着构造 对象。
  2. C ++编译器一次只允许1个构造函数。
  3. 记住这些,看看有问题的代码:

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

    这声明MySet的对象并用(1,10)构造它 现在使用= "hello" 没有必要再建一个,这会压倒现有的建筑。
    这就是错误的原因。