从构造函数体

时间:2016-09-01 23:40:21

标签: c++

我有一个具有不同构造函数的对象。现在我想添加另一个基于任意数据的构造函数,它将尝试处理该数据并调用正确的构造函数。

AFAIK有两种方法可以做到:

  • 返回创建对象的静态函数

    静态* from_data(/ 任意数据 /);

  • 创建一个由构造函数

  • 调用的私有“init”函数

但是我想知道使用所需的构造函数在这个问题上使用placement new会遇到什么问题和潜在的陷阱。所以代码是:

#include <new>

struct A
{
    /*different constructors*/
    A(int i) {};
    A(double d) {};

    A(/*large set of data*/)
    {
        /*large set of data gets processed and depending on the processing a different constructor gets called*/

        this->~A(); //deletes current object
        if (true) {
            new (this) A(1); //reconstructs object calling the correct constructor for the data
        } else {
            new (this) A(1.0); //reconstructs object calling the correct constructor for the data
        }

    };
};


int main(int argc, char* argv[])
{
    A a;
}

2 个答案:

答案 0 :(得分:3)

您希望从运行时信息(处理数据集的结果)中进行编译时决策(选择要委托的构造函数)。

这意味着你不能直接想要的东西。

但是你可以使用你的static成员函数的想法来返回创建的对象,除了它应该返回A*而不是A,否则就是智能指针。

重新提出其他建议的解决方案,

  

创建一个私有&#34; init&#34;由cosntructors调用的函数

......没有解决上述问题,而且这通常是个坏主意。

RE

  

在此使用展示位置有什么问题和潜在的陷阱

嗯,这不是你可以信赖的代码。我相信它的未定义行为,因为在对象自毁的时候,它没有被完全初始化。如果它应该证明它在技术上已经明确定义了手头的情况,那么它不是您想要依赖的代码。在可能的维护环境中,有人绊倒这些代码将不得不替换它,而不是浪费时间试图证明UB。只是对该语言的黑暗角落说不。

答案 1 :(得分:-2)

我简单地考虑花一些时间试图弄清楚所显示的示例是否会导致未定义的行为。但是我很快就认为这是无关紧要的,浪费时间,并且完全没有意义,因为当前的C ++标准有一个完全定义良好,干净的机制来完成同样的事情,并且集中我的工作效率会更高。回答这个问题,而不是。

我指的是委托构造函数,当然:

julia> convert(DataFrame, x')

当前的C ++标准为一个构造函数指定了一种定义良好的方法,通过调用不同的构造函数来委派构造和初始化类实例的实际工作。

请注意,在决定调用委托构造函数之前,这并不意味着一个构造函数可以执行任意代码。委托必须作为第一个业务顺序出现,您通常会看到构造函数的初始化部分;在那里你可以看到像超级班这样的东西。构造函数,如果有的话。

只有在委托构造函数返回后,委托构造函数才能选择运行更多自己的代码,才能完成作业。

但这只是一个小小的不便,只需要一点点编码即可轻松解决:

class A {

public:
     A(int n) {
        // whatever
     }

     A(const char *p, double z)
       : A(  /* some formula that calculates an int value goes here */ )
     {
     }
};