我目前正在尝试在我的项目中实现一系列继承类。因此,我使用成员初始值设定项列表,并将“变量”一直引用到基类。我真的不确定,为什么会出现编译器错误。
我已经尝试将引用“ int&id”更改为指针“ int * id”。 上面的示例只是指出我问题的一个最小示例:
class Base
{
public:
int& m_id;
Base(int &id)
: m_id(id)
{
}
};
class Derived1: virtual public Base
{
public:
Derived1(int &id) : Base(id)
{
};
};
class Derived2: public Derived1
{
public:
Derived2(int &id) : Derived1(id)
{
};
};
int main()
{
int i = 13;
Derived2 Test(i);
}
尝试编译时收到以下错误消息:
“错误:没有匹配的函数可以调用'Base :: Base()'”
任何想法,我在做什么错了?
感谢您的帮助。
答案 0 :(得分:2)
虚拟继承和虚拟函数是不同的概念。
虚拟继承的特殊之处在于
虚拟基需要由所有派生类显式初始化。
在这种情况下,// Make $array1 associative.
$array1 = array_column($array1, null, "id");
// Find all true values in $array1 from $array2
$result = array_intersect_key($array1, array_intersect(array_combine(array_keys($array2), array_column($array2, "status")), [true]));
尝试将Derived2
的初始化委托给Base
,
但这是无效的。
Derived1
的构造函数实际上所做的是
调用Derived2
的默认构造函数
因为省略了用于初始化Base
的 mem-initializer 。
您应该显式调用Base
的构造函数:
Base
当然,如果class Derived2 :public Derived1 {
public:
Derived2(int &id) : Base(id), Derived1(id)
{
};
};
并非虚拟地源自Derived1
,
那么Base
的派生类可以仅依靠Derived1
的构造函数
初始化Derived1
。
因此,另一种解决方案取决于您的情况,
就是简单地删除 base-specifier 中的Base
:
virtual
答案 1 :(得分:2)
虚拟继承是一种奇怪的野兽。它要求最派生的类初始化虚拟基类。在您的情况下,该初始化丢失。应该这样做:
public function sendcampaign(Request $request)
{
$this->validate($request,[
'subject'=>'required',
'to_email'=>'required',
'from_email'=>'required',
'message'=>'required'
]);
try {
$options = [
'list_id' => env('MAILCHIMP_AUDIENCE_ID'),
'subject' => $request->input('subject'),
'from_name' => $request->input('from_email'),
'from_email' => 'ad01santosh@gmail.com',
'to_name' => $request->input('to_email')
];
$content = [
'html' => $request->input('message'),
'text' => strip_tags($request->input('message'))
];
$campaign = Newsletter::create('regular', $options, $content);
Newsletter::send($campaign['id']);
return redirect()->back()->with('success','send campaign successfully');
} catch (Exception $e) {
return redirect()->back()->with('error','Error from MailChimp');
}
}