【问题标题】:Reference of pointer and left shift operator指针和左移运算符的引用
【发布时间】:2011-09-01 07:49:26
【问题描述】:

我已经重新定义了

class foo
{
    foo();
    virtual ~foo();

    void operator << (BaseService*& iRight);
}

在代码中的某个地方,有一个 foo 实例和一个服务,它是我所做的 BaseService 类的特化:

Service* service_pointer = new Service();
foo_instance << service_pointer;

但我收到此错误: 错误:'foo_instance

如果我将 service_pointer 动态转换为 BaseService,则不会发生任何变化

Service* service_pointer = new Service();
foo_instance << dynamic_cast<BaseService*>(service_pointer);

有什么想法吗?

【问题讨论】:

    标签: c++ pointers casting operator-overloading pass-by-reference


    【解决方案1】:

    第一个版本不起作用,因为您不能传入对指向子类型的指针的引用,这是正确的:如果 operator&lt;&lt; 的实现使指针指向实例 MyService(这是BaseService 的子类,但不是Service 的子类)?显然,Service* 指向MyService 是非法的。所以不允许传入Service*

    第二个版本是不允许的,因为dynamic_cast 不返回左值,所以你不能将它作为非常量引用传递。

    您唯一能做的就是定义另一个BaseService* 类型的变量并将其作为参数传递给&lt;&lt;。如果&lt;&lt; 然后重新分配指针,则该更改将仅对新创建的变量可见,不会影响ServicePointer

    话虽这么说(并且不知道您的用例),但我必须建议您让operator&lt;&lt; 对任何内容进行非常量引用,因为它的正确操作数让我觉得这是一种不好的做法。您通常不会期望 &lt;&lt; 修改它的正确操作数。

    【讨论】:

      【解决方案2】:

      仅仅因为Service * 类型可以转换为BaseService * 类型并不意味着Service *&amp; 类型可以转换为BaseService *&amp; 类型。它不是。这就是您的第一个调用无法编译的原因。

      尝试使用dynamic_cast(或任何其他非黑客演员)将无济于事。这种转换的结果不是左值。而且您不能将非常量引用绑定到不是左值的东西。这就是您的第二次调用无法编译的原因。

      如果您真的希望您的操作员专门接受BaseService *&amp;,那么您只能手动将Service * 预转换为BaseService * 类型的左值(即显式指针对象),然后使用该左值调用运算符

      Service* service_pointer = new Service();
      BaseService* base_service_pointer = service_pointer;
      foo_instance << base_service_pointer;
      

      如果您将声明更改为运算符,则您对运算符 &lt;&lt; 的调用将编译

      void operator <<(BaseService* const& iRight);
      

      但你能不能做到这取决于你的意图。为什么要通过引用传递指针?

      【讨论】:

      • 我试图通过引用传递一个指针,因为我的 foo 类包含一个服务列表,并且可能,使用
      【解决方案3】:

      您必须实际定义一个BaseService 指针变量。

      Service* service_pointer = new Service();
      BaseService* base_service_pointer = dynamic_cast<BaseService*>(service_pointer);
      foo_instance << base_service_pointer;
      

      因为要引用指针,所以不能是右值。

      还要注意dynamic_cast&lt;&gt;这里没有必要。 static_cast&lt;&gt; 会成功的。更好的是,使用从service_pointerbase_service_pointer 的简单赋值!

      【讨论】:

        【解决方案4】:

        这不可能工作,因为引用是非常量的,因此您可以更改 foo::operator class Service1 : BaseService { }; class Service2 : BaseService { }; void foo::operator << (BaseService*& iRight) { // ok, iRight is a reference to BaseService* // so we can assign Service2* to it, can't we? iRight = new Service2(); } Service1* service_pointer = new Service1(); foo_instance << service_pointer; // oops...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-14
          • 2021-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-27
          • 2014-08-02
          相关资源
          最近更新 更多