如何覆盖基数 class 的 (->) 运算符的成员
How can I override the member of (->) operator of a base class
背景:我让 Qt 生成了没有共同祖先的 UI classes。我正在子 classing class(比如,"Door"),它使用其中一个 UI classes,以及派生的 class( "OakDoor") 将使用不同的 UI class,尽管许多 UI 元素将具有相同的名称。
直到现在我一直隐藏基数 UI class(即派生的 class 使用不同类型但相同的 UI class name) 但现在需要依靠继承来处理基 class 在 UI classes 上工作的情况;在这种情况下隐藏不起作用。
我已经询问了一种使用继承来完成此操作的方法,并指出了使用组合的方向。所以我试图找到一种有效的方法来执行此操作,而不必为每个 UI 元素定义访问函数。这不是真正的构图,但我认为它让我不费吹灰之力就接近了。
class form_container
{
public:
form_container(){};
form_container(Ui_A_Form * form){_form = form;}
~form_container(){ delete _form; }
Ui_A_Form *_form;
Ui_A_Form & operator->()
{
return *_form;
}
};
当时的想法是让 Door 使用这个 class 而 OakDoor 使用它的子class:
class B_form_container : public form_container
{
public:
B_form_container(Ui_B_Form * form){_form=form;}
~B_form_container(){delete _form;}
Ui_B_Form *_form;
Ui_B_Form & operator->()
{
return *_form;
}
};
所以我真的只是在转移隐藏。无论如何,问题似乎出在我对运算符 ->() 的重载上。
在我门 class,我有
form_container *_myform
;
这是这样构造的:
_myform = new form_container(new A_Form());
但是当我尝试访问 A_Form 中的任何内容时它不会编译,例如 Qt SetupUI 函数:
_myform->setupUi(_a_widget);
我显然做错了什么。非常感谢那里的任何帮助 - 非常感谢! (当 subclass 试图删除 base class 中的 _form 时我可以看到问题,但我稍后会解决这个问题)
编辑:好的,现在正在编译(非常感谢@(R Sahu)),但我没有看到我期望的重载。例如:
class base_class()
{
form_container *_myform;
};
class derived_class(): public base_class()
{
//inherit _myform;
};
//(constructor for derived class)
derived_class()::derived_class()
{
_myform = new B_form_container(new B_form());
(*_myform)->setupUI(new QWidget()); // tries to setupUi on an A_form
}
这是在调用 form_container::operator->(),可能是因为它不是虚拟的。如果我在基础 class form_container 中将其设为虚拟,派生的 class B_form_container 会抱怨函数仅在 return 类型上有所不同。
有没有解决的办法?
例如,我可以做这样的事情吗:
class base : public A_form
{
virtual base * operator->()
{
// not sure how to return ->() operator of A_form
return A_form::operator->(); // ???
}
};
class derived : public base, public B_form
{
virtual base *operator->()
{
return B_form::operator->(); // again???
}
} ;
另一个编辑:我认为我想做的事情不再可能了。如果你能纠正我,请纠正我。与此同时,我要写一些东西来处理 moc 输出并创建 classes 带有我 可以 覆盖的访问函数。
_myform = new form_container(new A_Form());
_myform->setupUi(_a_widget);
不是用于访问 operator->()
函数的正确语法。使用该语法,编译器需要 class form_container
中的成员函数 setupUi()
。正确的语法是:
_myform = new form_container(new A_Form());
(*_myform)->setupUi(_a_widget);
// This translates to:
// Invoke the operator->() function on (*_myform)
// Use the return value of the function and call `setupUi()` on the returned pointer.
或
_myform = form_container(new A_Form());
_myform->setupUi(_a_widget);
此外,该函数需要return一个指针,而不是引用。
Ui_B_Form* operator->()
{
return _form;
}
正如我最终在上面意识到的那样,这是不可能的。运算符 ->() 必须 return 它所作用的类型,因此它不能用作虚函数。
背景:我让 Qt 生成了没有共同祖先的 UI classes。我正在子 classing class(比如,"Door"),它使用其中一个 UI classes,以及派生的 class( "OakDoor") 将使用不同的 UI class,尽管许多 UI 元素将具有相同的名称。
直到现在我一直隐藏基数 UI class(即派生的 class 使用不同类型但相同的 UI class name) 但现在需要依靠继承来处理基 class 在 UI classes 上工作的情况;在这种情况下隐藏不起作用。
我已经询问了一种使用继承来完成此操作的方法,并指出了使用组合的方向。所以我试图找到一种有效的方法来执行此操作,而不必为每个 UI 元素定义访问函数。这不是真正的构图,但我认为它让我不费吹灰之力就接近了。
class form_container
{
public:
form_container(){};
form_container(Ui_A_Form * form){_form = form;}
~form_container(){ delete _form; }
Ui_A_Form *_form;
Ui_A_Form & operator->()
{
return *_form;
}
};
当时的想法是让 Door 使用这个 class 而 OakDoor 使用它的子class:
class B_form_container : public form_container
{
public:
B_form_container(Ui_B_Form * form){_form=form;}
~B_form_container(){delete _form;}
Ui_B_Form *_form;
Ui_B_Form & operator->()
{
return *_form;
}
};
所以我真的只是在转移隐藏。无论如何,问题似乎出在我对运算符 ->() 的重载上。
在我门 class,我有
form_container *_myform
;
这是这样构造的:
_myform = new form_container(new A_Form());
但是当我尝试访问 A_Form 中的任何内容时它不会编译,例如 Qt SetupUI 函数:
_myform->setupUi(_a_widget);
我显然做错了什么。非常感谢那里的任何帮助 - 非常感谢! (当 subclass 试图删除 base class 中的 _form 时我可以看到问题,但我稍后会解决这个问题)
编辑:好的,现在正在编译(非常感谢@(R Sahu)),但我没有看到我期望的重载。例如:
class base_class()
{
form_container *_myform;
};
class derived_class(): public base_class()
{
//inherit _myform;
};
//(constructor for derived class)
derived_class()::derived_class()
{
_myform = new B_form_container(new B_form());
(*_myform)->setupUI(new QWidget()); // tries to setupUi on an A_form
}
这是在调用 form_container::operator->(),可能是因为它不是虚拟的。如果我在基础 class form_container 中将其设为虚拟,派生的 class B_form_container 会抱怨函数仅在 return 类型上有所不同。 有没有解决的办法? 例如,我可以做这样的事情吗:
class base : public A_form
{
virtual base * operator->()
{
// not sure how to return ->() operator of A_form
return A_form::operator->(); // ???
}
};
class derived : public base, public B_form
{
virtual base *operator->()
{
return B_form::operator->(); // again???
}
} ;
另一个编辑:我认为我想做的事情不再可能了。如果你能纠正我,请纠正我。与此同时,我要写一些东西来处理 moc 输出并创建 classes 带有我 可以 覆盖的访问函数。
_myform = new form_container(new A_Form());
_myform->setupUi(_a_widget);
不是用于访问 operator->()
函数的正确语法。使用该语法,编译器需要 class form_container
中的成员函数 setupUi()
。正确的语法是:
_myform = new form_container(new A_Form());
(*_myform)->setupUi(_a_widget);
// This translates to:
// Invoke the operator->() function on (*_myform)
// Use the return value of the function and call `setupUi()` on the returned pointer.
或
_myform = form_container(new A_Form());
_myform->setupUi(_a_widget);
此外,该函数需要return一个指针,而不是引用。
Ui_B_Form* operator->()
{
return _form;
}
正如我最终在上面意识到的那样,这是不可能的。运算符 ->() 必须 return 它所作用的类型,因此它不能用作虚函数。