我遇到了这个问题而且不知道如何解决它。
假设我有这些基类:
class ValueBase
{
private:
int base_value;
public:
int GetValue();
void SetValue(int val);
virtual ValueBase* Meet(ValueBase* const a, ValueBase* const b) = 0;
}
class NodeBase
{
private:
ValueBase* base_nodeValue;
public:
bool AddValue(int val);
}
和派生类:
class Value : public ValueBase
{
public:
Value* Meet(ValueBase* a, ValueBase* b) override;
}
有没有办法在类Value
的方法AddValue
中创建类NodeBase
的实例?我知道我应该使AddValue
纯虚拟并在NodeBase
的派生类中实现它,但有没有这个选项可以做到这一点?我可以使用例如模板方法或可能在Value
中回调构造该对象的方法?或者这样做太邪恶了?
EDITED:
我无法访问类Value
NodeBase
答案 0 :(得分:5)
添加创建成员函数:
class ValueBase
{
public:
virtual ValueBase * create() = 0;
// ...
};
然后在NodeBase
中,您可以使用base_nodeValue->create()
。
派生类实现它:
class Value : public ValueBase
{
Value * create() override { return new Value; }
};
此模式的更常见形式是 clone 函数,但它不会生成相同类型的默认构造对象,而是 copy :< / p>
Derived * clone() override { return new Derived(*this); }
答案 1 :(得分:1)
如果不改变类定义,我认为没有办法。然而,有许多方法涉及改变类定义,这取决于你是什么&#34;允许&#34;使用。
一个。将DateTime lastSyncTime = db.Table<SyncAudit>().AsEnumerable() // Do the rest of the processing in memory
.Select(c => DateTime.Parse(c.SyncTime))
.OrderByDescending(dt => dt)
.FirstOrDefault();
return lastSyncTime;
模板化为应创建的对象类型:
AddValue()
B中。创建创建 class NodeBase
{
private:
ValueBase* base_nodeValue;
public:
template<class ValueType>
bool AddValue(int val) { base_nodeValue = new ValueType; }
}
...
// other code that has access to Value
node.AddValue<Value>(10);
的函数(如果需要,将任何参数转发给构造函数Value
AddValue`:
) and pass it as an argument to
(也可以在这里使用仿函数或lambda)
℃。您可以在 // might need to adapt syntax
class NodeBase
{
private:
ValueBase* base_nodeValue;
public:
bool AddValue(int val, ValueBase* (*creator)()) { base_nodeValue = (*creator)(); }
}
...
// other code that has access to Value
ValueBase* valueCreator() { return new Value; }
...
node.AddValue(10, valueCreator);
中创建一个返回ValueBase
的函数。
Value*
这实际上类似于工厂方法:您可以class ValueBase
{
public:
static ValueBase* createValue();
};
class NodeBase
{
private:
ValueBase* base_nodeValue;
public:
bool AddValue(int val) { base_nodeValue = ValueBase::createValue(); }
};
// in a separate cpp
ValueBase* ValueBase::createValue() { return new Value; }
接受参数并根据它创建不同的createValue()
。让ValueBase
存储一些指向创建者函数的指针,你可以让它根本不知道ValueBase
,只需在其他地方初始化该指针,就像你可以在基类的工厂表中注册子类一样