簡體   English   中英

指向成員變量的多態指針

[英]Polymorphic pointer to member variables

我正在嘗試以多態方式使用指向成員變量的指針。

這有效:

struct Foo
{
   int member0;
   int member1;

   int* getMember( int i )
   {
     static int Foo::* table[2] = { &Foo::member0, &Foo::member1 };
     return &( this->*table[i] );
   }
};

這不是,因為成員不是同一類型(BaseClass):

struct Foo
{
   SubClassA member0;
   SubClassB member1;

   BaseClass* getMember( int i )
   {
     static BaseClass Foo::* table[2] = { &Foo::member0, &Foo::member1 };
     return &( this->*table[i] );
   }
};

g++報錯為:

[...] invalid conversion from 'SubClassA Foo::*' to 'BaseClass Foo::*'
[...] invalid conversion from 'SubClassB Foo::*' to 'BaseClass Foo::*'

有沒有辦法使這項工作,即將成員指針“向上轉換”到它的基 class?

BaseClass* getMember(const int i)
{
  switch(i)
  {
  case 0: return &member0;
  case 1: return &member1;
  default: throw <exception>;
  }
}

為了穩健性,您無論如何都必須檢查i是否在范圍內或 0 和 1 內; 所以你可以考慮這種簡化的方法。

這是不可能的。 由於多個 inheritance,基地址並不總是與派生地址相同。 您需要一些隱藏的地址調整魔術來將一個轉換為另一個,並且一個指向成員的指針,作為一個非常簡單的 object(基本上是一個 integer 偏移量)不能適應這種魔術。

確實,有時只需要調整地址,當不需要時,原則上可以允許多態成員指針。 但為了簡單和一致,這並沒有完成。

您可以使用指向接受 Foo* 並返回 BaseClass* 的函數(或類似函數的對象)的指針,而不是指向成員的指針。 不過,您必須為每個成員制作一個單獨的 function。

更簡單的方法是完全跳過成員數據指針。

getMember(int i) {
    BaseClass* ptr[2] = { &member0, &member1 };
    return ptr[i];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM