代码之家  ›  专栏  ›  技术社区  ›  Thomas Flinkow

C++重载赋值操作符

  •  1
  • Thomas Flinkow  · 技术社区  · 7 年前

    我有一个结构,它有一个unicode bstr字符串成员,如下所示:

    struct Foo
    {
        wchar_t* Bar;
    }
    

    如果我现在想设置字符串成员,我会

    Foo f;
    f.Bar = SysAllocString(L"Hello world");
    

    有点冗长。


    有什么办法可以让我 wchar_t 分配运算符以便我可以隐藏 SysAllocString 打电话就可以写

    Foo f;
    f.Bar = L"Hello world";
    

    重载的赋值运算符将处理 系统分配字符串 打电话?

    我在想这样的东西(伪代码):

    wchar_t* ???::operator=(const wchar_t* rhs)
    {
        return SysAllocString(rhs);
    }
    

    但我不知道该放什么而不是 ??? 因为我没有在上课。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Remy Lebeau    7 年前

    wchar_t 是内置类型,因此不能在其上重载运算符也就是说,你可以使用 std::wstring 而不是原始指针,或定义 Foo::operator=(wchar_t*) 以下内容:

    struct Foo
    {
        wchar_t* Bar;
        Foo& operator=(wchar_t* bar) { Bar = SysAllocString(bar); return *this; }
    }
    
    Foo foo;
    foo = L"Hello, World!";
    

    从评论:

    很幸运那对我不起作用我正在寻找一个解决方案,它可以在不必为每个结构本身执行建议的解决方案的情况下,为任意结构工作

    可以在基类中定义该运算符:

    struct FooBase
    {
        wchar_t* Bar;
        Foo& operator=(wchar_t* bar) { Bar = SysAllocString(bar); return *this; }
    }
    
    struct Foo : FooBase { /* whatever */ };
    Foo foo;
    foo = L"Hello, World!";
    

    …或者使用标准库中的类型:)

        2
  •  2
  •   M.M    7 年前

    首先,如果它是一个 BSTR 那么成员应该是:

    struct Foo
    {
        BSTR Bar;
    };
    

    尽管 英国夏令时 是的typedef wchar_t * 我是说, a BSTR has different semantics to a string of wchar_t ,所以这可以作为自我文档。


    现在,在OLE中用一个类来管理一个OLE是正常的 英国夏令时 是的。你既可以使用现有的,也可以自己滚动。IHHO最好使用已经存在的一个,虽然滚动你自己可以是一个有趣的学习经验。

    我不建议尝试将BSTR管理功能拼接到 Foo 是的。这就导致了5/0的违规行为bstr管理应该在自己的类中是自包含的,然后您可以将这些容器中的一个声明为 是的。


    如果您使用的是Microsoft ATL,那么您可能已经 _bstr_t CComBSTR 可用。

    在明威-w64, _bstr_t 可与 #include <stdio.h> 然后 #include <comutil.h> 并与 -loleaut32 .

    其他一些编译器/框架有自己的包装类 英国夏令时 .