0

我在这里问了这个问题:C++ Method chaining with classes

本质上,我想做的是使用方法链接从另一个类调用构造函数/方法。假设我有 2 个课程:

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

};

我的主要目标是主要执行以下操作:

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;

 };
4

2 回答 2

4

您隐含地不能也不应该做您似乎正在尝试做的事情,即在不构造类的实例的情况下调用类的构造函数。

如果您想要 Parser 在 Signal 中的行为,那么您至少有三个选项: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 即可。

于 2013-09-11T19:52:32.090 回答
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;
};

但是,我建议您查看访问者模式以获得更通用的解决方案。

或者至少不要在 Parse 构造函数中执行工作,而是在某些方法中执行。

于 2013-09-11T19:59:43.823 回答