手动对象构造函数调用

发布于 2024-11-07 10:36:34 字数 359 浏览 2 评论 0原文

您能否告诉我是否可以手动调用对象构造函数?我知道这是错误的,我永远不会在自己的代码中做类似的事情,并且我知道我可以通过创建和调用初始化函数来解决这个问题,但是问题是我偶然发现了一个情况,其中有数千行代码对象及其父对象的构造函数...

class MyClass()
{
    MyClass() { }
    virtual ~MyClass();

    void reset()
    {
         this->~MyClass();
         this->MyClass::MyClass(); //error: Invalid use of MyClass
    }
};

Can you please tell me if it is possible to call object constructor manually? I know it's wrong and I would never do something like that in my own code and I know I can fix this problem by creating and calling initialization function, however the problem is that I stumbled at a case where there are thousands of lines of code in object's and its parents' constructors...

class MyClass()
{
    MyClass() { }
    virtual ~MyClass();

    void reset()
    {
         this->~MyClass();
         this->MyClass::MyClass(); //error: Invalid use of MyClass
    }
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

她说她爱他 2024-11-14 10:36:34

您仍然可以将构造/销毁移动到单独的函数中并直接调用它们。 IE

class MyClass {
public:
    MyClass() { construct(); }
    ~MyClass() { destruct(); }

    void reset() {
        destruct();
        construct();
    }

private:
    void construct() {
        // lots of code
    }

    void destruct() {
        // lots of code
    }
};

You can still move construction/destruction into separate functions and call those directly. i.e.

class MyClass {
public:
    MyClass() { construct(); }
    ~MyClass() { destruct(); }

    void reset() {
        destruct();
        construct();
    }

private:
    void construct() {
        // lots of code
    }

    void destruct() {
        // lots of code
    }
};
人生百味 2024-11-14 10:36:34

您可以使用放置新语法:

this->~MyClass(); // destroy
new(this) CMyClass(); // construct at the same address

You could use placement new syntax:

this->~MyClass(); // destroy
new(this) CMyClass(); // construct at the same address
深居我梦 2024-11-14 10:36:34

使用放置 new 调用构造函数,

new (address) MyClass();

这会在地址处的空白空间中构造一个 MyClass。

但永远不会在课堂上内部这样做!

编辑
如果您已经拥有正确类型的对象,并且想要为其分配默认值,则另一种方法是

*this = MyClass();

创建一个具有默认值的新对象,并将该值分配给现有对象。

A constructor is called using placement new

new (address) MyClass();

This constructs a MyClass in an empty space at address.

Would never do this inside the class though!

Edit
If you already have an object of the right type, and want to assign it default values, an alternative is

*this = MyClass();

which creates a new object with default values and assigns that value to your existing object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文