【问题标题】:Creating an object without calling it's constructor [closed]创建一个对象而不调用它的构造函数[关闭]
【发布时间】:2018-07-06 02:13:51
【问题描述】:

我在 SO 上看到了一些涉及此问题的问题,但我似乎遇到了一个独特的问题。

我正在尝试创建一个对象,然后在我的代码中的其他地方进行一些初始化,并在完成之后调用构造函数。为此,我创建了一个指向对象实例的智能指针,然后将其重置:

#include "relevantHeaders.h"
using namespace std;

int main(int argc, char *argv[])
{
    std::unique_ptr<MyObject> obj;

    if(someCondition){
        // Do stuff
        obj.reset(new MyObject(stuff));
    }
    doOtherStuff(obj);
}

我需要这样做的原因是因为obj 在我调用构造函数的条件之后继续使用 - 如果我要在正常调用中在条件下创建对象,那么它稍后将超出范围。

首先,经过一些研究,这在我看来是最好的方法。想法?

其次,我在编译时遇到这个错误:

The text ">" is unexpected.  It may be that this token was intended as 
a template argument list terminator but the name is not known to be a 
template

这是什么意思?

编辑:由于每个人都高度关注relevantHeaders.h,所以让我这样说...以下(伪)代码可以正常工作:

#include "relevantHeaders.h"
using namespace std;

int main(int argc, char *argv[])
{
    MyObject obj;

    if(someCondition){
        // Do stuff
        // obj.reset(new MyObject(stuff));
    }
    doOtherStuff(obj);
}

也就是说,我可以使用MyObject 就好了。当我添加 std 实用程序 unique_ptr 时它会中断。

【问题讨论】:

  • "relevantHeaders.h" 实际上是什么?请提供minimal reproducible example 而不是伪造代码!
  • “有问题的代码很长” 这就是为什么我要求提供一个 minimal 示例来重现您的问题.您想要基于猜测的答案吗?
  • @Anonymous:“我说我没有看到为我的问题制作一个完整的工作(但最小)示例的价值。” - 然后这个问题在 Stack Overflow 上是题外话。我们需要能够将您的代码复制并粘贴到编辑器中并运行编译器,而无需编辑一行。
  • 回复:“这是什么意思?” -- 表示"relevantHeaders.h" 有问题。如果你拒绝谈论那个标题的内容,没人能告诉你真正的问题是什么。
  • @Anonymous:“不,这绝对是荒谬的。” - Stack Overflow 不同意你的观点。实际上,不仅是 Stack Overflow。在 Usenet 时代,此类问题的答案曾经是“我没有水晶球”。在 SO 上对一个问题进行近距离投票只是现代的等价于发布这样的回复。 “您在回答这个包含不可运行代码的问题时没有问题:” - 如果只缺少 #include &lt;iostream&gt;#include &lt;string&gt; 行,那么我有时(太?)慷慨。

标签: c++ oop object constructor


【解决方案1】:

如果为您的对象创建浅拷贝还不够,请声明您自己的赋值运算符。如果浅拷贝没问题,什么也不做,一个隐式的浅拷贝赋值运算符会为你生成。

那么你可以这样做:

MyObject obj;
if(things) {
    obj = MyObject(stuff);
}

【讨论】:

  • 我不明白为什么在这种情况下浅拷贝是不够的。我不会有两个不同的对象共享相同的浅拷贝值,它只是obj。在什么情况下会出现问题?
  • 在什么情况下会出现问题? 仅在浅拷贝不足以满足 MyObject 的成员变量的情况下。如果 MyObject 没有任何对象或内存管理(例如,只包含int 成员变量),那么应该没问题。
  • @Anonymous 在Shallow Copy vs Deep Copy 上阅读更多内容。一个简单的规则是,如果你有任何由类分配的动态内存,你可能需要一个深拷贝。另请参阅the Rule of Three,了解何时应该实现自己的赋值运算符。
  • @scohe001 谢谢。在我的情况下,MyObject 非常大,包含来自数十个标题的内容,而不是我编写的。这就是为什么我要小心。我会仔细阅读您发布的链接,并仔细检查我的情况。
  • @Anonymous 也许我应该为这种情况改写三法则。您是否为 MyObject 类实现了析构函数?如果没有并且您没有内存泄漏,那么隐式浅拷贝赋值运算符对您来说很好。否则,您需要声明自己的。
猜你喜欢
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2020-04-12
  • 1970-01-01
  • 2019-07-25
相关资源
最近更新 更多