这更多的是一个设计问题。
我有一个模板类,我想根据模板类型向其添加额外的方法。为了实践 DRY 原则,我提出了这个模式(有意省略定义):
template <class T>
class BaseVector: public boost::array<T, 3>
{
protected:
BaseVector<T>(const T x, const T y, const T z);
public:
bool operator == (const Vector<T> &other) const;
Vector<T> operator + (const Vector<T> &other) const;
Vector<T> operator - (const Vector<T> &other) const;
Vector<T> &operator += (const Vector<T> &other)
{
(*this)[0] += other[0];
(*this)[1] += other[1];
(*this)[2] += other[2];
return *dynamic_cast<Vector<T> * const>(this);
}
virtual ~BaseVector<T>()
{
}
}
template <class T>
class Vector : public BaseVector<T>
{ …Run Code Online (Sandbox Code Playgroud) 我已经在 StackOverflow 中看到了有关此类似错误的所有帖子,但仍然找不到导致我的问题的原因。
我用来std::dynamic_pointer_cast将std::shared_ptr<Base>对象转换为std::shared_ptr<DerivedShared>对象,但遇到“尝试引用已删除的函数”错误。我已确保Base析构函数是虚拟的,但错误仍然存在。
可能是什么原因导致此错误?我该如何解决它?标准库中是否存在任何可能导致此问题的已知限制或错误?任何见解或建议将不胜感激。
PS:我知道它可以工作,static_pointer_cast但想知道是什么导致了问题dynamic_pointer_cast!
struct Base
{
Base() = default;
virtual ~Base() = default;
//Copy
Base(const Base&) = default;
Base& operator=(const Base&) = default;
//Move
Base(Base&&) = default;
Base& operator=(Base&&) = default;
};
struct DerivedShared : public Base
{
public:
DerivedShared() //: data(std::shared_ptr<int[]>(new int[3]{1,2,3}))
{
//data = std::make_shared<int[]>(new int[3]{ 1,2,3 });
data = std::shared_ptr<int[]>(new int[3]{ 1,2,3 });
}
public:
std::shared_ptr<int[]> data;
};
int main()
{ …Run Code Online (Sandbox Code Playgroud) 以下是否有任何真正的区别:
id value;
BOOL compare1 = [value isMemberOfClass:[SomeClass class]];
BOOL compare2 = [value class] == [SomeClass class];
Run Code Online (Sandbox Code Playgroud)
检查是否value是一个SomeClass对象?
当我使用指向继承类的指针调用基类函数时,为什么会出现编译错误?
例:
class cFoo {};
class cBar : public cFoo {};
void func1(cFoo *) {} // base class
void func2(cFoo **) {} // base class
void main(void)
{ cBar bar, *pbar; // inherited class
func1(&bar); // compiles OK
func2(&pbar); // fail
func2(dynamic_cast<cFoo**>(&pbar)); // 'class cFoo ** ' : invalid target type for dynamic_cast
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
前几天我遇到了一个实例,我有一个函数,它指向一个基类型,然后我需要向上转换为派生类型以访问一些额外的功能.然而,dynamic_cast失败了,这很奇怪,因为我的类型肯定继承了基类型.
为了了解正在发生的事情的底部,我创建了以下测试程序,我认为它复制了我所看到的:
void cast(TestClass *baseType)
{
if (dynamic_cast<Derived *>(baseType))
TRACE("cast was sucessful");
else
TRACE("cast failed");
}
int main(int argc, char *argv[])
{
Derived *test1 = new Derived();
TestClass *test2 = new TestClass();
TestClass test3;
test1->identify(); // prints: this is a Derived class
test2->identify(); // prints: this is a TestClass
cast(test1); // succesful
cast(test2); // fail - expected
// reassign test2 to test1
test2 = test1;
test2->identify(); // prints: this is a Derived class
cast(test2); // succesful
// the …Run Code Online (Sandbox Code Playgroud) 我有一个父类"base"和另一个继承自"base"的类"derived".
"衍生"有1种方法cH1.
如果我这样做:
base* b = new derived();
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这一点:
b->cH1();
Run Code Online (Sandbox Code Playgroud)
显然我不能和有2个解决方案:
或者这样做:
dynamic_cast<derived*>(b)->cH1();
Run Code Online (Sandbox Code Playgroud)哪一个是更好的做法?
根据MSDN,__ RTTynamicCast()函数用于dynamic_cast在Visual C++中实现.其参数LONG VfDelta之一被描述为"对象中虚函数指针的偏移".
AFAIK vptr始终位于对象的起始位置,因此偏移量始终为零.我仔细研究了使用的各种代码片段的反汇编,dynamic_cast我从来没有见过任何东西,只有零被传递代替这个参数.
是否vptr位于任何地方,但物体开始?这种偏移可以是零吗?
我想编写一个方法,将Base对象指针作为参数传递,并在方法内部将其转换为派生对象指针.
void func( const Base* const obj){
Derived* der = dynamic_cast<Derived*>(obj);
}
Run Code Online (Sandbox Code Playgroud)
但它显示错误,因为动态强制转换不能抛弃const说明符.但我不明白为什么const必须在这里删除说明符,我所做的只是创建一个派生指针,它应指向基指针之后的一些偏移量.我也试过const Derived* const der = dynamic_cast<Derived*>(obj);,但没有结果.
将参数传递为非常重要const.我怎样才能做到这一点?我必须做这件事的第一应用丑陋的方式const_cast,然后dynamic_cast?有没有更好的方法?
在我的应用程序中,我有一个包含顶栏和桌子的视图.通过从议程中获取联系人的信息来填充桌面视图.
到目前为止一切正常,但我想从表中选择一个单元格并按下顶部栏上的一个按钮转到另一个视图.不幸的是,这部分根本不起作用.
这是我尝试过的:
class myAgendaTableViewController: UITableViewController ,UINavigationControllerDelegate,ABPeoplePickerNavigationControllerDelegate{
@IBOutlet var EditButton: UIBarButtonItem!
@IBOutlet var table: UITableView!
var objects : NSMutableArray! = NSMutableArray()
var addressBookController :ABPeoplePickerNavigationController!
var contactsArray :NSMutableArray! = NSMutableArray()
//...........//
//the method I assigned to the edit button
@IBAction func pressedEdit(sender: UIBarButtonItem) {
self.objects.insertObject(NSDate.date(), atIndex: 0)
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
var array :NSMutableArray = NSMutableArray()
var ContactDetailsView : ContactDetails
ContactDetailsView = self.storyboard.instantiateViewControllerWithIdentifier("Agenda") as ContactDetails
var personDict = self.contactsArray.objectAtIndex(0) as NSDictionary
//println(personDict.objectForKey("firstName") ) //the dictionary exists and all …Run Code Online (Sandbox Code Playgroud) 这个问题是关于应该使用哪种C++样式转换进行此转换.我知道C风格的演员可以达到这个目的.
对于以下class结构:
class Foo {};
class Bar : public Foo {};
Run Code Online (Sandbox Code Playgroud)
说我得到了:Foo* ptr;我想把它投射到Bar*我应该使用哪种类型的演员表?好像我必须dynamic_cast按原样使用:
用于转换多态类型
我想避免,dynamic_cast因为它是一个运行时转换.
dynamic-cast ×10
c++ ×8
rtti ×2
casting ×1
class ×1
cocoa ×1
const ×1
const-cast ×1
inheritance ×1
ios ×1
objective-c ×1
parent-child ×1
pointers ×1
reference ×1
shared-ptr ×1
swift ×1
templates ×1
this ×1
visual-c++ ×1