1

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

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 ';' 在'='标记之前

不是什么大问题,但一直试图理解为什么无效。

感谢您提供任何有用的回复。

更多信息...猜我是要编辑我的操作?

关于为什么上述被认为是非法的令人费解,一直在寻找一个明确的原因......当然还有一个技巧可以让编译器接受这种符号。

考虑到合法的类似用途

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 ‘&lt;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 的符号中,这将是一个熟悉的声明,在我宣布它非法之前,我想检查一下是否错过了一个技巧。

谢谢。

4

3 回答 3

3

因为

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

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

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

就像:

int x = 5;  //initialization, not assignment

相当于

int x(5);

并不是

int x;
x = 5;
于 2012-04-30T08:32:59.497 回答
1

问题是当你写:

MySet C = "hello";

实际上调用了字符数组的构造函数(如果存在),而不是赋值运算符。因此,您的代码会使编译器感到困惑:要调用两个构造函数中的哪一个。

基本上声明行上的相等转换为构造函数调用。从那时起使用赋值运算符。

于 2012-04-30T08:35:34.173 回答
0

记住2点:

  1. 声明变量时,后续=不是赋值运算符,而是用于构造对象。
  2. C++ 编译器一次只允许 1 个构造函数。

记住这些,看看有问题的代码:

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

这声明和对象MySet并用(1,10).
现在没有必要再使用另一个结构= "hello"来压倒现有的结构。
这就是错误的原因。

于 2012-04-30T08:35:42.553 回答