【问题标题】:Overload operator new for a different return value为不同的返回值重载运算符 new
【发布时间】:2012-10-30 18:27:12
【问题描述】:

是否可以重载运算符 new() 以使其返回值与 void* 不同?

我有两个结构:

一个结构 (A) 只保存数据,什么不保存。

第二个结构 (B) 的作用类似于指向第一个结构的指针:

struct A;

struct B
{

private:

    A* ptr;

public:

    A& operator*() { return (*ptr); };
    A& operator->() { return (*ptr); };

};


struct A
{
    int data;

    B operator&() { B ret;  ret.ptr = this; return ret; };
};

这个想法就这么简单。 我不希望任何外部类处理指向 A 的指针,而不是直接处理。

但是,我确实希望他们能够创建 A 的实例。有没有办法覆盖 A 的 new 运算符以返回 B 的实例?现在别在意安全问题和处理删除,这只是一个简单的简化示例来解释我的问题。

【问题讨论】:

  • 私人构造函数不会在这里完成这项工作吗?
  • 重写运算符new 几乎总是错误 的事情。为什么不将构造函数和析构函数设为私有,并使用工厂方法返回包装新类实例的智能指针?
  • @Jasper 没错,这是有道理的;但是,在私有构造函数的情况下,创建新副本的典型实现是什么?工厂?
  • @Rook 实际上,我已经重载了 new 所以我可以确保结构的所有实例都在内存池中......但是,否则,是的,我知道你的意思 V_V跨度>
  • 如果您希望将结构放置在专门管理的内存段中,那么覆盖 new 运算符可能是合适的。您应该使用 (placement new 运算符)[stackoverflow.com/questions/222557/…

标签: c++ pointers operator-overloading new-operator


【解决方案1】:

没有。

3.7.4.1 分配函数:

...返回类型应为void*。 ...

正如 BigBoss 所说,这是因为 new 运算符调用 operator new 并期望它具有特定的返回类型。

【讨论】:

    【解决方案2】:

    运算符 new 只负责为类分配内存,然后 C++ 在内部调用构造函数来初始化该内存,所以如果你想覆盖 new A 导致 B,那么你应该覆盖 C++ !

    相反,您可能有:

    struct A {
    private
        friend struct B;
        A() {}
    };
    struct B {
        static B new_A() {return B(new A());}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      相关资源
      最近更新 更多