Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你考虑多个初始化步骤吗?糟糕的形式;? 我写的是C++中的物理模拟(Ising模型),它是用正方格来操作的。我的程序的核心是我的Ising类,它带有一个调用晶格的行和列维度的构造函数。我还有另外两种方法来设置系统的其他参数(温度和初始状态)在进化系统之前必须调用它们例如,示例程序可能如下所示 int main() { Ising system(30, 30); system.set_state(up); system.set_temperature(2); for(int t = 0; t < 1000; t++) { system.step(); } return 0; } intmain(){ 伊辛系统(30,30); 系统。设置状态(设置); 系统。设置温度(2); 对于(int t=0;t Ising < /Cord>类.@ Alxand R.C,确实,如果参数太多,就有必要引入一个参数对象。但是IMHO 4参数还不是一个大问题。请注意,构造函数只实现一次,但可以从许多不同的位置调用,从而增加错误概率。谢谢!这几乎就是为什么我认为这可能是一个坏主意(措辞有了很大改进)。虽然我从未想过要添加一个单独的类来初始化…但我必须尝试一下!不,它不是糟糕的形式,就像绝对初学者的代码是糟糕的形式一样。这就像是绝对的初学者代码。通过更多的经验,您将了解类不变量和RAII(两者都需要单个构造步骤),并了解支持简单构造函数使用的技术,例如NPI。 SimulationInfo si; // accept all defaults Simulation sim(si); sim.simulate(1000);_C++_Oop - Fatal编程技术网

你考虑多个初始化步骤吗?糟糕的形式;? 我写的是C++中的物理模拟(Ising模型),它是用正方格来操作的。我的程序的核心是我的Ising类,它带有一个调用晶格的行和列维度的构造函数。我还有另外两种方法来设置系统的其他参数(温度和初始状态)在进化系统之前必须调用它们例如,示例程序可能如下所示 int main() { Ising system(30, 30); system.set_state(up); system.set_temperature(2); for(int t = 0; t < 1000; t++) { system.step(); } return 0; } intmain(){ 伊辛系统(30,30); 系统。设置状态(设置); 系统。设置温度(2); 对于(int t=0;t Ising < /Cord>类.@ Alxand R.C,确实,如果参数太多,就有必要引入一个参数对象。但是IMHO 4参数还不是一个大问题。请注意,构造函数只实现一次,但可以从许多不同的位置调用,从而增加错误概率。谢谢!这几乎就是为什么我认为这可能是一个坏主意(措辞有了很大改进)。虽然我从未想过要添加一个单独的类来初始化…但我必须尝试一下!不,它不是糟糕的形式,就像绝对初学者的代码是糟糕的形式一样。这就像是绝对的初学者代码。通过更多的经验,您将了解类不变量和RAII(两者都需要单个构造步骤),并了解支持简单构造函数使用的技术,例如NPI。 SimulationInfo si; // accept all defaults Simulation sim(si); sim.simulate(1000);

你考虑多个初始化步骤吗?糟糕的形式;? 我写的是C++中的物理模拟(Ising模型),它是用正方格来操作的。我的程序的核心是我的Ising类,它带有一个调用晶格的行和列维度的构造函数。我还有另外两种方法来设置系统的其他参数(温度和初始状态)在进化系统之前必须调用它们例如,示例程序可能如下所示 int main() { Ising system(30, 30); system.set_state(up); system.set_temperature(2); for(int t = 0; t < 1000; t++) { system.step(); } return 0; } intmain(){ 伊辛系统(30,30); 系统。设置状态(设置); 系统。设置温度(2); 对于(int t=0;t Ising < /Cord>类.@ Alxand R.C,确实,如果参数太多,就有必要引入一个参数对象。但是IMHO 4参数还不是一个大问题。请注意,构造函数只实现一次,但可以从许多不同的位置调用,从而增加错误概率。谢谢!这几乎就是为什么我认为这可能是一个坏主意(措辞有了很大改进)。虽然我从未想过要添加一个单独的类来初始化…但我必须尝试一下!不,它不是糟糕的形式,就像绝对初学者的代码是糟糕的形式一样。这就像是绝对的初学者代码。通过更多的经验,您将了解类不变量和RAII(两者都需要单个构造步骤),并了解支持简单构造函数使用的技术,例如NPI。 SimulationInfo si; // accept all defaults Simulation sim(si); sim.simulate(1000);,c++,oop,C++,Oop,如果在system.step()之前未调用system.set_*()方法,system.step()将引发异常,提醒用户该问题。我以这种方式实现它以简化我的构造函数;这是一种不好的做法吗?建议尽可能将所有强制参数都放在构造函数中(当然也有例外,但到目前为止应该很少)。通过这种方式,您可以使您的类更容易和更安全地使用 还要注意的是,通过简化构造函数,客户机代码反而变得更加复杂,这在IMO中是一个糟糕的权衡。构造函数只编写一次,但调用方代码可能需要编写多次(增加了编写代码的数量和出错的可能性).如

如果在system.step()之前未调用system.set_*()方法,system.step()将引发异常,提醒用户该问题。我以这种方式实现它以简化我的构造函数;这是一种不好的做法吗?

建议尽可能将所有强制参数都放在构造函数中(当然也有例外,但到目前为止应该很少)。通过这种方式,您可以使您的类更容易和更安全地使用


还要注意的是,通过简化构造函数,客户机代码反而变得更加复杂,这在IMO中是一个糟糕的权衡。构造函数只编写一次,但调用方代码可能需要编写多次(增加了编写代码的数量和出错的可能性).

如果必须按特定顺序调用初始化方法,那么我会将对它们的调用包装在它们自己的方法中,因为这表明这些方法本身不是原子的,因此应该将如何调用它们的“知识”保存在一个地方


无论如何,这是我的意见

IMO如果每次都必须调用所有这些初始化步骤,那么这是一种糟糕的形式。设计良好的软件的目标之一是最大限度地减少出错的机会,而在对象“可用”之前必须调用多个方法只会使其更难正确运行。如果这些调用是可选的,那么将它们作为单独的方法就可以了


分享和享受。

我一点也不喜欢。从外部文件加载数据时,我面临着同样的问题。创建对象时(即调用其各自的CTOR),数据仍然不可用,只能在稍后阶段检索。因此,我将初始化分为不同阶段:

  • 建造师
  • 初始化(第一次激活对象时由框架引擎调用)
  • 激活(每次激活对象时调用)
  • 这对于我正在开发的框架来说是非常具体的,但是仅仅使用构造函数无法处理所有问题


    但是,如果在调用ctor时知道变量,最好不要使代码复杂化。对于任何使用您的代码的人来说,这都可能是一个令人头疼的问题。

    类中的全部要点是呈现某种抽象。作为一个类的用户,我应该能够假设它的行为类似于它所建模的抽象


    部分原因是类必须始终有效。一旦创建了对象(通过调用构造函数),类必须处于有意义的有效状态。它应该可以随时使用。如果不是,那么它就不再是一个好的抽象。

    如果您计划在同一个晶格上初始化并运行多个瞬态,那么设置初始条件应该与构造函数分开

    如果运行瞬态并停止,则可以在构造函数内移动初始条件设置,但这意味着您必须传入参数值才能执行此操作


    我完全同意这样一种观点,即一个对象应该在其构造函数被调用后100%准备好使用,但我认为这与设置初始温度场的物理过程是不同的。该对象可以完全可用,但问题中的每个节点都处于相同的绝对零度温度。从热传递的角度来看,隔热体中的均匀温度场没有多大意义。

    正如另一位评论员指出的那样,必须调用一系列初始化函数是一种糟糕的形式。我会在课堂上总结这一点:

    class SimulationInfo
    {
    private:
        int x;
        int y;
        int state;
        int temperature;
    
    public:
        SimulationArgs() : x(30), y (30), state(up), temperature(2) { }; // default ctor
        // custom constructors here!
    
        // properties
        int x() const { return x; };
        int y() const { return y; };
        int state() const { return state; };
        int temperature() const { return temperature; };
    };  // eo class SimulationInfo
    
    
    class Simulation
    {
    private:
        Ising m_system;
    
    public:
        Simulation(const SimulationInfo& _info) : m_system(_info.x(), _info.y())
        {
            m_system.set_state(_info.state());
            m_system.set_temperature(_info.temperature());
        } // eo ctor
    
    
        void simulate(int _steps)
        {
            for(int step(0); step < _steps; ++steps)
                m_system.step();
        } // eo simulate
    }; // eo class Simulation
    

    您还可以考虑一个<代码> ISIGNEXPROSTALSTATE 类,您的用户必须将其填充并作为参数传递给您的代码> Ising < /Cord>类.@ Alxand R.C,确实,如果参数太多,就有必要引入一个参数对象。但是IMHO 4参数还不是一个大问题。请注意,构造函数只实现一次,但可以从许多不同的位置调用,从而增加错误概率。谢谢!这几乎就是为什么我认为这可能是一个坏主意(措辞有了很大改进)。虽然我从未想过要添加一个单独的类来初始化…但我必须尝试一下!不,它不是糟糕的形式,就像绝对初学者的代码是糟糕的形式一样。这就像是绝对的初学者代码。通过更多的经验,您将了解类不变量和RAII(两者都需要单个构造步骤),并了解支持简单构造函数使用的技术,例如NPI。
    SimulationInfo si; // accept all defaults
    Simulation sim(si);
    sim.simulate(1000);