【问题标题】:error while instantiating a class实例化类时出错
【发布时间】:2012-07-09 20:13:52
【问题描述】:

我有一个关于在 C++ 中实例化对象的简单问题: 如果我们假设我的类有一个默认构造函数,那么我会像这样创建新对象:

PfAlgorithm object = new PfAlgorithm();

但是当我运行我得到这个错误:

conversion from ‘PfAlgorithm*’ to non-scalar type ‘ns3::PfAlgorithm’ requested

有人可以向我解释这个错误的原因吗? 非常感谢你。

【问题讨论】:

    标签: c++ object instantiation


    【解决方案1】:

    new 运算符返回一个指针,而不是一个值。所以你需要写:

    PfAlgorithm* object = new PfAlgorithm()
    

    其中object 是指向新分配的PfAlgorithm 对象的指针。可以在here 找到一些关于指针的简单介绍性信息。然而,正如在下面的 cmets 中所讨论的,处理原始指针几乎从来都不是一个好主意(由于内存泄漏的潜在问题、所有权不明确的问题等)。继续阅读...

    在堆上分配了这个对象后,你需要确保在完成后删除它,否则你的应用程序会泄漏内存。为了使这更容易,我强烈建议您还考虑使用来自boost libraries(或来自 C++11)的智能指针来管理您的内存。

    或者,正如其他人所建议的那样,您可以简单地这样做:

    PfAlgorithm object;
    

    并在堆栈上分配您的对象,而不必担心管理内存。

    【讨论】:

    • 这样做比必要的复杂。丢失指针(因此丢失new)。鉴于 OP 提供的详细程度,这只是不是可接受的解决方案。
    • @KonradRudolph。好的。我很欣赏指针很复杂。但是,坦率地说,如果不了解 C++,您将不会在 C++ 中走得太远。所以我认为额外包含堆栈分配是完全有效的(正如其他人所做的那样,正如我所包括的那样),但断言这不是一个可接受的解决方案是相当极端的。
    • @Alex 我可以引导你到deck of presentation slides about pointers …。我坚持我的主张。拥有内存的原始指针在 C++ 中没有位置。拥有它们的代码质量很差。
    • @KonradRudolph。善良。我完全同意。但是在分配对象(堆栈/堆)的位置和管理它的方式之间存在区别。所以无论如何都提倡new-ing 直接进入智能指针,但你似乎只在最初的评论中建议堆栈分配。
    【解决方案2】:

    有没有可能你在 Java 方面的经验比在 C++ 方面更有经验?与 Java 不同,在 C++ 中,当您实例化一个对象时不需要new

    PfAlgorithm object;
    

    创建一个PfAlgorithm 类型的对象就好了。当变量超出范围时,该对象会自动销毁。

    【讨论】:

      【解决方案3】:

      C++ 区分对象(在您的情况下为 PfAlgorithm 类型)和指向对象的指针(PfAlgorithm *)。 new PfAlgorithm() 表达式返回一个指向新分配对象的指针。如果这是您想要的,您还必须使 object 具有指针类型:

      PfAlgorithm *object = new PfAlgorithm();
      

      如果您不想使用指针,请去掉new

      PfAlgorithm object = PfAlgorithm();
      

      在第一种情况下,一旦你不再使用它,你将不得不delete你的对象;在第二种情况下,对象将在退出创建它的块 ({...}) 时被销毁。没有像 Java 或 C# 那样的自动内存管理。

      【讨论】:

        猜你喜欢
        • 2015-01-02
        • 2015-04-30
        • 2016-06-01
        • 2021-08-24
        • 1970-01-01
        • 2020-09-20
        • 2021-11-14
        • 2018-04-16
        • 1970-01-01
        相关资源
        最近更新 更多