[英]using *void as a buffer for static_cast
所以我去這個:
class A;
class B : public A;
class C : public B;
vector<A*> *vecA;
vector<C*> *vecC;
我想將vectC轉換為vecA。
vector<A*> *_newA = static_cast< vector<A*>* >(vecC); //gives an error
因此,我將void指針用作緩沖區和演員表:
void *buffer = vecC;
vector<A*> *_newA = static_cast< vector<A*>* >(buffer); //works
這有效嗎? 還有另一種方法嗎?
您應該只具有一個std::vector<A*>
,然后當您希望在其中放入B
或C
,可以這樣做:
std::vector<A*> vec;
vec.push_back(b);
這將比您目前正在執行的任何操作都要好得多。
另外,根據指針的所有權語義,應使用std::unique_ptr
或std::shared_ptr
。 擁有原始指針是不行的!!
這有效嗎?
不,這不對。 完全不確定,如果您訪問它會發生什么。
還有另一種方法嗎?
是。 這取決於您想做什么:
復制內容: std::copy(vecC.begin(), vecC.end(), std::back_inserter(vecA));
如果給定C*
的容器或迭代器或任何其他派生類型,則創建一個充當A*
隨機訪問容器的適配器
我確定還有其他解決方案,只需告訴我們您想做什么
在我看來,您似乎正在尋找對通用(模板)類型的協變支持。 C ++完全不支持此功能。 CLR和C#/ VB支持它,盡管僅在最新版本中支持。
盡管如此,要呼應他人的回應,您可能會吠叫錯誤的樹。 我的直覺是,您希望有一個指向A型對象的指針的向量……並且這種類型應包括虛方法和虛析構函數-必要時。 如果沒有更好地了解您要解決的高級問題,就不可能更具體地討論合適的替代方法,這在您的問題中並不明顯。
您可能需要知道的魔術詞是“協方差”和“逆方差”。 在這里查看一個非常相關的問題。
簡短的答案:沒有一種整潔,明智的方法可以僅通過強制轉換來進行您想要的轉換。 您將需要很長一段時間才能將新載體復制到舊載體的內容中。
但更重要的是:1.永遠不要在標准容器類型上使用new
。 2.不要傳遞指向標准容器類型的指針。 3.不要將原始指針傳遞給自己的對象,而應使用std::shared_ptr
。
在C ++ 11中,不要通過void*
繞行,而只需使用reinterpret_cast
。
但是,您想要的轉換允許非常不好的事情 :
#include <iostream>
#include <vector>
using namespace std;
class Base {};
class Derived: public Base
{ public: int x; Derived(): x(42) {} };
int main()
{
vector< Derived* > v;
Derived d;
v.push_back( &d );
cout << v.back()->x << endl; // 42
vector< Base* >* pbv =
reinterpret_cast< vector< Base* >* >( &v );
Base b;
pbv->push_back( &b );
cout << v.back()->x << endl; // indeterminate value
}
與將T**
轉換為T const**
大致相同(不允許,可能會帶來不好的事情)。 簡而言之,除非您確切知道自己在做什么,否則不要這樣做。 它的時間較長,嗯,這里沒有討論的余地,但是它涉及區分可變和不可變的集合,並且要非常小心。
A
指針或智能指針的向量,然后使用C ++多態性(即虛擬成員函數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.