我在这里问了这个问题:C++ Method chaining with classes
在essesance中,我要做的是使用Method chaining从另一个类调用Constructor / Method。假设我有两个班级:
class Signal {
public:
Signal() { } // constructor
Signal& ParseSignal() {
// In this method I want to call
// the constructor "Parse()"
}
protected:
std::vector<double> data;
};
我还有另一个名为Parse
的课程:
class Parse {
public:
Parse() {
// This is the implementation
// I need to access the "data" contained in class "Signal
};
我的主要目标是在main中执行以下操作:
Signal s = Signal().ParseSignal();
然后接受信号,然后解析它。
有人建议我应该使用CRTP
但是,由于基类(在这种情况下为Signal
)必须有一个template<>
参数,这是不可能的继承其他类。
这个问题有另一个解决方案吗?
编辑:
我尝试过以下操作,但它看起来像dirty
实现,我无法访问成员变量:
class Parser {
public:
Parser() {
parse();
}
void parse() {
cout << "YES";
}
};
class Signal {
public:
friend class Parser;
Signal() { val = 0;}
Signal& Parse() {
Parser::Parser();
return *(this);
}
protected:
int val;
};
答案 0 :(得分:4)
你隐含地不能也不应该做你想要做的事情,即调用类的构造函数而不构造类的实例。
如果你想要信号中Parser的行为,那么你至少有三个选项:1。继承Parser,2。添加一个Parser成员,3。创建一个Parser可以作为参数的“Parseable”接口类
class Parser {
public:
class Interface {
public:
std::vector<double> m_data;
};
Parser(Interface& interface) {
parse(interface);
}
};
class SignalInheriting : public Parser::Interface {
public:
SignalInheriting() {
Parser p(*this); // can take the Parser::Interface view of this object.
}
};
class SignalMember {
Parser::Interface m_parserIface;
public:
SignalMember() : m_parserIface() {
}
};
在这样的构造函数中进行繁重的工作非常适合混淆或狗展示代码,但对于需要任何维护的生产系统来说非常糟糕。
但是,如果你能够在周六凌晨3点(当你被挂掉的话)诊断出像这样免提工作的代码中的问题,那就去吧。
您应该选择哪种模式的主要因素是与解析相关的数据将持续多长时间以及Signal对象将持续多长时间。
相反,如果Signal对象只是“Parse”API的特化,那么只需继承Parse并完成。
答案 1 :(得分:3)
做你想做的最简单的方法就是这样:
class Parse {
public:
Parse(std::vector<double> &data) {
// do stuff
}
};
class Signal {
public:
Signal() { } // constructor
Signal& ParseSignal() {
Parse parser(data);
return *this;
}
protected:
std::vector<double> data;
};
但是我建议您查看Visitor Pattern以获得更通用的解决方案。
或者至少不要在Parse构造函数中完成工作,而是用某种方法来做。